char *mult(char *a, char *b) { char *pp; int lena, lenb, n; char *tmp; lena = strlen(a); lenb = strlen(b); n = max_n(lena, lenb); reverse(a); reverse(b); if(n == lenb) { tmp = a; a = b; b = tmp; } /* 1 extra for null char */ pp = malloc(n*2 + 1); pp[n*2] = 0; for(int i = 0; i < n*2; i++) pp[i] = '0'; mult1(a, b, pp, n, 0); reverse(pp); reverse(a); reverse(b); return pp; }
void mult(int a[size], int n, int c[size]) { int *d=new int[size]; for(int i=0; i<size; i++) d[i]=0; int *cmult=new int[size]; while(n>0){ mult1(a, n%10, cmult); add(d, cmult, d); n/=10; } for(int i=0; i<size; i++) c[i]=d[i]; }
void mult1(char a[], char b[], char pp[], int n, int level) { int mplier; int res, car; if(level == strlen(b)) return; else { mplier = str2int(b[level]); for(int i = 0; i < n; i++) { res = (str2int(a[i]) * mplier) + str2int(pp[level+i]); car = res / 10; res = res % 10; pp[level+i] = int2str(res); pp[level+i+1] = int2str(str2int(pp[level+i+1]) + car); } return mult1(a, b, pp, n, level+1); } }
/* Main computational kernel. The whole function will be timed, including the call and return. */ static void kernel_floyd_warshall(int n, DATA_TYPE POLYBENCH_2D(path,N,N,n,n)) { int i1, i2, j3; #pragma scop for(int k=0; k< _PB_N; k++){ multifor(i1=0,i2=0,j3=0; i1<k+1, i2<k+1, j3<k+1; i1++,i2++,j3++; 1,1,1; 0,1,1){ 0:{ mult1(i1, path, k); } 1:{ mult2(i2,path, n, k); } 2:{ mult3(j3,path,n,k); } } for(int i=k+1; i<n;i++){ for(int j=k+1;j<n;j++){ path[i][j] = path[i][j] < path[i][k] + path[k][j] ? path[i][j] : path[i][k] + path[k][j]; } } } //source code for (k = 0; k < _PB_N; k++) //source code { //source code for(i = 0; i < _PB_N; i++) //source code for (j = 0; j < _PB_N; j++) //source code path[i][j] = path[i][j] < path[i][k] + path[k][j] ? //source code path[i][j] : path[i][k] + path[k][j]; //source code } #pragma endscop }
int main(void) { FILE *finalB1L1 = fopen("finalB1L1.txt", "r"); FILE *finalB1L2 = fopen("finalB1L2.txt", "r"); FILE *finalW1L1 = fopen("finalW1L1.txt", "r"); FILE *finalW1L2 = fopen("finalW1L2.txt", "r"); FILE *finalSoftmaxTheta = fopen("finalSoftmaxTheta.txt", "r"); FILE *testData = fopen("testData.txt", "r"); FILE *testLabels = fopen("testLabels.txt", "r"); FILE *testresult = fopen("result.txt", "r"); int Labels[10000]; char line[8000]; char *ptr; int i; int j; void *VA; int fd; clock_t time; if ((fd = open("/dev/mem", (O_RDWR|O_SYNC))) == -1) { perror("ERROR: could not open \"/dev/mem\"\n"); return 1; } VA = mmap(NULL, HW_SPAN, (PROT_READ|PROT_WRITE), MAP_SHARED, fd, HW_BASE); if (VA == MAP_FAILED) { perror("ERROR: mmap() failed ... \n"); close(fd); return 1; } sdram = VA + ((unsigned long)(HW_BASE + 0x00) & (unsigned long)(HW_MASK)); printf("sdram = 0x%X\n", (unsigned int)sdram); puts("parsing start"); time = (float) clock(); i = 0; while (fgets(line, 8000, finalB1L1) != NULL) { line[strlen(line)-1] = '\0'; ((float*)sdram)[B1L1_OFFSET+i] = atof(line); i++; } i = 0; while (fgets(line, 8000, finalB1L2) != NULL) { line[strlen(line)-1] = '\0'; ((float*)sdram)[B1L2_OFFSET+i] = atof(line); i++; } i = 0; while (fgets(line, 8000, testLabels) != NULL) { line[strlen(line)-1] = '\0'; Labels[i] = atoi(line); i++; } unsigned short buf = 0; int count = 0; int writeCount = 0; while (fgets(line, 8000, finalW1L1) != NULL) { line[strlen(line)-1] = '\0'; ptr = strtok(line, ","); while (ptr != NULL) { count++; buf <<= 4; buf = buf | ((short)(round(atof(ptr))) & 0xF); if (count == BUS_WITH/4) { count = 0; ((short*)sdram)[WEIGHTS1_OFFSET + writeCount++] = buf; buf = 0; } ptr = strtok(NULL, ","); } } buf = 0; count = 0; writeCount = 0; while (fgets(line, 8000, finalW1L2) != NULL) { line[strlen(line)-1] = '\0'; ptr = strtok(line, ","); while (ptr != NULL) { count++; buf <<= 4; buf = buf | ((short)(round(atof(ptr))) & 0xF); if (count == BUS_WITH/4) { count = 0; ((short*)sdram)[WEIGHTS2_OFFSET + writeCount++] = buf; buf = 0; } ptr = strtok(NULL, ","); } } rewind(finalW1L2); i = 0; j = 0; while (fgets(line, 8000, finalW1L2) != NULL) { line[strlen(line)-1] = '\0'; ptr = strtok(line, ","); while (ptr != NULL) { ((float*)sdram)[W1L2_OFFSET+i*200+j] = atof(ptr); j++; ptr = strtok(NULL, ","); } j = 0; i++; } i = 0; j = 0; while (fgets(line, 8000, finalSoftmaxTheta) != NULL) { line[strlen(line)-1] = '\0'; ptr = strtok(line, ","); while (ptr != NULL) { ((float*)sdram)[SOFTMAX_OFFSET+i*200+j] = atof(ptr); j++; ptr = strtok(NULL, ","); } j = 0; i++; } i = 0; j = 0; while (fgets(line, 8000, testData) != NULL) { line[strlen(line)-1] = '\0'; ptr = strtok(line, ","); while (ptr != NULL) { ((float*)sdram)[DATA_OFFSET+i*784+j] = round(atof(ptr)); j++; ptr = strtok(NULL, ","); } j = 0; i++; } fprintf(stderr, "parsing end: %.2f seconds\n",(float) (clock() - time) / CLOCKS_PER_SEC); float max = 0; int maxidx = 0; int fignum = 0; count = 0; time = (float) clock(); for (fignum = 0; fignum < FIGNUM; fignum++) { //writeZero(); mult1(fignum, 200, 784, 1); //writeResult(results, fignum); add(HIDDEN1_OFFSET, B1L1_OFFSET, 200, 1); sigmoid(HIDDEN1_OFFSET, 200); //mult2(W1L2_OFFSET, HIDDEN1_OFFSET, 200, 200, 1); newmult2(W1L2_OFFSET, HIDDEN1_OFFSET, 200, 200, 1); add(HIDDEN2_OFFSET, B1L2_OFFSET, 200, 1); sigmoid(HIDDEN2_OFFSET, 200); mult3(SOFTMAX_OFFSET, HIDDEN2_OFFSET, 10, 200, 1); sigmoid(OUT_OFFSET, 10); for (i = 0; i< 10; i++ ) { //printf("%.3f\t", final[i][0]); if (((float*)sdram)[OUT_OFFSET+i] > max) { max = ((float*)sdram)[OUT_OFFSET+i]; maxidx = i + 1; } } printf("max_index = %d; expected %d\n", maxidx, Labels[fignum]); if (Labels[fignum] == maxidx) { count++; } max = 0; maxidx = 0; } fprintf(stderr, "Calculation: %.2f seconds\n",(float) (clock() - time) / CLOCKS_PER_SEC); printf("sample size = %d, accuracy = %f\n", fignum, count / (float)fignum); return 0; }
//最终返回长度集合 vector<double>MyCalcu::calculate( double X, double Y, double Z, double a, double b, double c) { //存储上下顶点集合 vector<matrixly> v1; vector<matrixly> v2; //存储Bi点的集合 vector<matrixly> v3; //杆长临时集合 vector<double> temp_list; //杆长变化集合 vector<double> move_list; //视觉识别X,Y,Z 结构体 matrixly CA; CA.dataly[0][0]=X; CA.dataly[1][0]=Y; CA.dataly[2][0]=Z+400; CA.rowly=3; CA.colly=1; //下平台点坐标 matrixly C1; matrixly C2; matrixly C3; matrixly C4; matrixly C5; matrixly C6; matrixly C7; matrixly C8; double dataC1[3] ={-200,158,0}; double dataC2[3] ={60,158,0}; double dataC3[3] ={200,158,0}; double dataC4[3] ={258,60,0}; double dataC5[3] ={200,-158,0}; double dataC6[3] ={-60,-158,0}; double dataC7[3] ={-200,-158,0}; double dataC8[3] ={-258,-60,0}; for(int q=0;q<3;q++) { C1.dataly[q][0]=dataC1[q]; C2.dataly[q][0]=dataC2[q]; C3.dataly[q][0]=dataC3[q]; C4.dataly[q][0]=dataC4[q]; C5.dataly[q][0]=dataC5[q]; C6.dataly[q][0]=dataC6[q]; C7.dataly[q][0]=dataC7[q]; C8.dataly[q][0]=dataC8[q]; } C1.rowly=3; C1.colly=1; C2.rowly=3; C2.colly=1; C3.rowly=3; C3.colly=1; C4.rowly=3; C4.colly=1; C5.rowly=3; C5.colly=1; C6.rowly=3; C6.colly=1; C7.rowly=3; C7.colly=1; C8.rowly=3; C8.colly=1; v1.push_back( C1 ); v1.push_back( C2 ); v1.push_back( C3 ); v1.push_back( C4 ); v1.push_back( C5 ); v1.push_back( C6 ); v1.push_back( C7 ); v1.push_back( C8 ); //上平台点坐标 matrixly A1; matrixly A2; matrixly A3; matrixly A4; matrixly A5; matrixly A6; matrixly A7; matrixly A8; double dataA1[3] ={-200,158,0}; double dataA2[3] ={-60,158,0}; double dataA3[3] ={200,158,0}; double dataA4[3] ={258,-60,0}; double dataA5[3] ={200,-158,0}; double dataA6[3] ={60,-158,0}; double dataA7[3] ={-200,-158,0}; double dataA8[3] ={-258,60,0}; for(int p=0;p<3;p++) { A1.dataly[p][0]=dataA1[p]; A2.dataly[p][0]=dataA2[p]; A3.dataly[p][0]=dataA3[p]; A4.dataly[p][0]=dataA4[p]; A5.dataly[p][0]=dataA5[p]; A6.dataly[p][0]=dataA6[p]; A7.dataly[p][0]=dataA7[p]; A8.dataly[p][0]=dataA8[p]; } A1.rowly=3; A1.colly=1; A2.rowly=3; A2.colly=1; A3.rowly=3; A3.colly=1; A4.rowly=3; A4.colly=1; A5.rowly=3; A5.colly=1; A6.rowly=3; A6.colly=1; A7.rowly=3; A7.colly=1; A8.rowly=3; A8.colly=1; v2.push_back( A1 ); v2.push_back( A2 ); v2.push_back( A3 ); v2.push_back( A4 ); v2.push_back( A5 ); v2.push_back( A6 ); v2.push_back( A7 ); v2.push_back( A8 ); //A double data1[3][3] ={1,0,0,0,cos(a),-sin(a),0,sin(a),cos(a)}; //B double data2[3][3] ={cos(b),0,sin(b),0,1,0,-sin(b),0,cos(b)}; //C double data3[3][3] ={cos(c),-sin(c),0,sin(c),cos(c),0,0,0,1}; matrix A; A.col=3; A.row=3; for(int i=0;i<3;i++) for(int j=0;j<3;j++) { A.data[i][j]=data1[i][j]; } matrix B; B.col=3; B.row=3; for(int m=0;m<3;m++) for(int n=0;n<3;n++) { B.data[m][n]=data2[m][n]; } matrix C; C.col=3; C.row=3; for(int o=0;o<3;o++) for(int p=0;p<3;p++) { C.data[o][p]=data3[o][p]; } //show(A); //show(B); //show(C); //show(mult(C,B)); //show(mult(mult(C,B),A)); //showly(mult1(mult(mult(C,B),A), v2.at(1))); //showly(add(CA,mult1(mult(mult(C,B),A), v2.at(1)))); //进行8次求解Bi for(int count = 0; count<8;count++) { //添加集合 v3.push_back(add(CA,mult1( mult(mult(C,B),A), v2.at(count)))); } //清空数据 temp_list.clear(); //计算长度 for(int countn=0;countn<8;countn++) { temp_list.push_back(distance(v3.at(countn),v1.at(countn))); } return temp_list; };