打开微信,使用扫一扫进入页面后,点击右上角菜单,
点击“发送给朋友”或“分享到朋友圈”完成分享
做矩阵乘法时会报这个错、奇怪的是之前没有
void Mlu_gemm(int8_t *A, int8_t *B, float *C, int32_t M, int32_t N, int32_t K, int16_t pos1, int16_t pos2,float &return_time){ struct timeval start; struct timeval end; float time_use; cnrtRet_t ret; //CNRT 库函数的返回类型,表示函数执行的结果或状态。通常,这种类型的返回值可以包含多种可能的状态,例如成功、失败、错误码等。 unsigned int count=0; cnrtGetDeviceCount(&count); cnrtSetDevice(0); //指定设备 //2.通过CNRT接口创建运行队列 cnrtQueue_t queue; cnrtQueueCreate(&queue); //3.设置Kernel的任务规模 cnrtDim3_t dim={1,1,1}; //4.设置Kernel的任务类型 BLOCK或者unionU cnrtFunctionType_t ktype=CNRT_FUNC_TYPE_BLOCK; int N_align = N; float *d_c = NULL; int8_t *d_a = NULL; int8_t *d_w = NULL; int16_t pos = pos1 + pos2; // 分配空间 CNRT_CHECK(cnrtMalloc((void **)&d_c, sizeof(float) * M * N_align)); CNRT_CHECK(cnrtMalloc((void **)&d_a, sizeof(int8_t) * M * K)); CNRT_CHECK(cnrtMalloc((void **)&d_w, sizeof(int8_t) * K * N_align)); // 将矩阵A和B的内容赋值给新分配的空间 CNRT_CHECK(cnrtMemcpy(d_a, A, sizeof(int8_t) * M * K, CNRT_MEM_TRANS_DIR_HOST2DEV)); CNRT_CHECK(cnrtMemcpy(d_w, B, sizeof(int8_t) * K * N_align,CNRT_MEM_TRANS_DIR_HOST2DEV)); //v1版本gemm gettimeofday(&start, NULL); gemm16Kernel1<<<dim,ktype, queue>>>(d_c,d_a,d_w,M,N,K,pos); gettimeofday(&end, NULL); time_use =((end.tv_sec - start.tv_sec) * 1000000 + (end.tv_usec - start.tv_usec)) /1000.0; printf("gemmV1's time_use is %f\n",time_use); //8.cnrt接口将计算结果拷贝至host cnrtQueueSync(queue); CNRT_CHECK(cnrtMemcpy(C, d_c, sizeof(float)* M *N_align, CNRT_MEM_TRANS_DIR_DEV2HOST)); CNRT_CHECK(cnrtQueueDestroy(queue)); printf("output C:"); for(int i=0;i<10;i++){ for(int j =0; j < 10; j++){ printf("%f\t",C[i + j]); } } cnrtFree(d_c); cnrtFree(d_a); cnrtFree(d_w); free(A); free(B); free(C); }
热门帖子
精华帖子