打开微信,使用扫一扫进入页面后,点击右上角菜单,
点击“发送给朋友”或“分享到朋友圈”完成分享

做矩阵乘法时会报这个错、奇怪的是之前没有
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);
}热门帖子
精华帖子