×

签到

分享到微信

打开微信,使用扫一扫进入页面后,点击右上角菜单,

点击“发送给朋友”或“分享到朋友圈”完成分享

执行队列同步函数报错cnrtQueueSync(queue) zooey2024-03-14 14:11:15 回复 查看 使用求助
执行队列同步函数报错cnrtQueueSync(queue)
分享到:

image.png



做矩阵乘法时会报这个错、奇怪的是之前没有

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);

}


版权所有 © 2024 寒武纪 Cambricon.com 备案/许可证号:京ICP备17003415号-1
关闭