问题遇到的现象和发生背景

我有一块开发板使用的是rk3399这款瑞芯微的芯片,带有一个mali-T860的GPU,烧入了ubuntu18.04系统,系统中有用OpenCL。

我是用OpenCL测试了GPU带宽性能,发现Device2Host和Host2Device这两个方向的带宽是4000MB/s,而Device2Device这个方向的带宽是2000MB/s。

请问为何Device2Host和Host2Device这两个方向的带宽会比Device2Device这个方向的带宽多一倍?个人认为因为mali-gpu和cpu是共享内存的,难道不应该是三个方向都差不多吗?

问题相关代码,请勿粘贴截图
/////  test the bandwidth of a device to host memcopy of a specific size///double testHostToDeviceTransfer(unsigned int memSize, accessMode accMode, memoryMode memMode){    double elapsedTimeInSec = 0.0;    double bandwidthInMBs = 0.0;    unsigned char* h_data = NULL;    cl_mem cmPinnedData = NULL;    cl_mem cmDevData = NULL;    cl_int ciErrNum = CL_SUCCESS;

    // Allocate and init host memory, pinned or conventional    if(memMode == PINNED)   {         // Create a host buffer        cmPinnedData = clCreateBuffer(cxGPUContext, CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, memSize, NULL, &ciErrNum);        oclCheckError(ciErrNum, CL_SUCCESS);

        // Get a mapped pointer        h_data = (unsigned char*)clEnqueueMapBuffer(cqCommandQueue, cmPinnedData, CL_TRUE, CL_MAP_WRITE, 0, memSize, 0, NULL, NULL, &ciErrNum);        oclCheckError(ciErrNum, CL_SUCCESS);

        //initialize         for(unsigned int i = 0; i < memSize/sizeof(unsigned char); i++)        {            h_data[i] = (unsigned char)(i & 0xff);        }

        // unmap and make data in the host buffer valid        ciErrNum = clEnqueueUnmapMemObject(cqCommandQueue, cmPinnedData, (void*)h_data, 0, NULL, NULL);        oclCheckError(ciErrNum, CL_SUCCESS);        h_data = NULL;  // buffer is unmapped    }    else     {        // standard host alloc        h_data = (unsigned char *)malloc(memSize);

        //initialize         for(unsigned int i = 0; i < memSize/sizeof(unsigned char); i++)        {            h_data[i] = (unsigned char)(i & 0xff);        }    }

    // allocate device memory     cmDevData = clCreateBuffer(cxGPUContext, CL_MEM_READ_WRITE, memSize, NULL, &ciErrNum);    oclCheckError(ciErrNum, CL_SUCCESS);

    // Sync queue to host, start timer 0, and copy data from Host to GPU    clFinish(cqCommandQueue);    shrDeltaT(0);    if(accMode == DIRECT)    {         if(memMode == PINNED)         {            // Get a mapped pointer            h_data = (unsigned char*)clEnqueueMapBuffer(cqCommandQueue, cmPinnedData, CL_TRUE, CL_MAP_READ, 0, memSize, 0, NULL, NULL, &ciErrNum);            oclCheckError(ciErrNum, CL_SUCCESS);        }

        // DIRECT:  API access to device buffer         for(unsigned int i = 0; i < MEMCOPY_ITERATIONS; i++)        {                ciErrNum = clEnqueueWriteBuffer(cqCommandQueue, cmDevData, CL_FALSE, 0, memSize, h_data, 0, NULL, NULL);                oclCheckError(ciErrNum, CL_SUCCESS);        }        ciErrNum = clFinish(cqCommandQueue);        oclCheckError(ciErrNum, CL_SUCCESS);    }     else     {        // MAPPED: mapped pointers to device buffer and conventional pointer access        void* dm_idata = clEnqueueMapBuffer(cqCommandQueue, cmDevData, CL_TRUE, CL_MAP_WRITE, 0, memSize, 0, NULL, NULL, &ciErrNum);        oclCheckError(ciErrNum, CL_SUCCESS);        if(memMode == PINNED )         {            h_data = (unsigned char*)clEnqueueMapBuffer(cqCommandQueue, cmPinnedData, CL_TRUE, CL_MAP_READ, 0, memSize, 0, NULL, NULL, &ciErrNum);             oclCheckError(ciErrNum, CL_SUCCESS);         }         for(unsigned int i = 0; i < MEMCOPY_ITERATIONS; i++)        {            memcpy(dm_idata, h_data, memSize);        }        ciErrNum = clEnqueueUnmapMemObject(cqCommandQueue, cmDevData, dm_idata, 0, NULL, NULL);        oclCheckError(ciErrNum, CL_SUCCESS);    }

    //get the the elapsed time in seconds    elapsedTimeInSec = shrDeltaT(0);

    //calculate bandwidth in MB/s    bandwidthInMBs = ((double)memSize * (double)MEMCOPY_ITERATIONS)/(elapsedTimeInSec * (double)(1 << 20));

    //clean up memory    if(cmDevData)clReleaseMemObject(cmDevData);    if(cmPinnedData)     {        clEnqueueUnmapMemObject(cqCommandQueue, cmPinnedData, (void*)h_data, 0, NULL, NULL);        clReleaseMemObject(cmPinnedData);    }    h_data = NULL;

    return bandwidthInMBs;}/////  test the bandwidth of a device to host memcopy of a specific size///double testDeviceToDeviceTransfer(unsigned int memSize){    double elapsedTimeInSec = 0.0;    double bandwidthInMBs = 0.0;    unsigned char* h_idata = NULL;    cl_int ciErrNum = CL_SUCCESS;

    //allocate host memory    h_idata = (unsigned char *)malloc( memSize );

    //initialize the memory    for(unsigned int i = 0; i < memSize/sizeof(unsigned char); i++)    {        h_idata[i] = (unsigned char) (i & 0xff);    }

    // allocate device input and output memory and initialize the device input memory    cl_mem d_idata = clCreateBuffer(cxGPUContext, CL_MEM_READ_ONLY, memSize, NULL, &ciErrNum);    oclCheckError(ciErrNum, CL_SUCCESS);    cl_mem d_odata = clCreateBuffer(cxGPUContext, CL_MEM_WRITE_ONLY, memSize, NULL, &ciErrNum);             oclCheckError(ciErrNum, CL_SUCCESS);    ciErrNum = clEnqueueWriteBuffer(cqCommandQueue, d_idata, CL_TRUE, 0, memSize, h_idata, 0, NULL, NULL);    oclCheckError(ciErrNum, CL_SUCCESS);

    // Sync queue to host, start timer 0, and copy data from one GPU buffer to another GPU bufffer    clFinish(cqCommandQueue);    shrDeltaT(0);    for(unsigned int i = 0; i < MEMCOPY_ITERATIONS; i++)    {        ciErrNum = clEnqueueCopyBuffer(cqCommandQueue, d_idata, d_odata, 0, 0, memSize, 0, NULL, NULL);                        oclCheckError(ciErrNum, CL_SUCCESS);    }    

    // Sync with GPU    clFinish(cqCommandQueue);

    //get the the elapsed time in seconds    elapsedTimeInSec = shrDeltaT(0);

    // Calculate bandwidth in MB/s     //      This is for kernels that read and write GMEM simultaneously     //      Obtained Throughput for unidirectional block copies will be 1/2 of this #    bandwidthInMBs = 2.0 * ((double)memSize * (double)MEMCOPY_ITERATIONS)/(elapsedTimeInSec * (double)(1 << 20));

    //clean up memory on host and device    free(h_idata);    clReleaseMemObject(d_idata);    clReleaseMemObject(d_odata);

    return bandwidthInMBs;}

运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果

关于mali-T860这款GPU的带宽问题相关推荐

  1. 超越英伟达的,不会是另一款GPU?这家深圳公司发布全球首款数据流AI芯片

    2020年6月23日,鲲云科技在深圳举行产品发布会,发布全球首款数据流AI芯片CAISA,定位于高性能AI推理,已完成量产. 鲲云通过自主研发的数据流技术在芯片实测算力上实现了技术突破,较同类产品在芯 ...

  2. 超越英伟达的,不会是另一款GPU!中国公司发布首款数据流AI芯片

    2020年6月23日,鲲云科技在深圳举行产品发布会,发布全球首款数据流AI芯片CAISA,定位于高性能AI推理,已完成量产.鲲云通过自主研发的数据流技术在芯片实测算力上实现了技术突破,较同类产品在芯片 ...

  3. HP Xeon 55xx上GPU的带宽问题

    HP Xeon 55xx的服务器上NVIDIA GPU的带宽问题 但是通过SDK的带宽测试,数值比较奇怪. host -> device 最高不到3GB/S,  device-> host ...

  4. 英伟达的这款GPU太强了!

    点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 今年 3 月 21 日 - 24 日举办的 NVIDIA GTC 2022 大会可谓是亮点十足.NVIDIA ...

  5. gpu云服务器运行游戏_滴滴云不甘寂寞,国内首发一款GPU云服务器

    北京时间9月1日,滴滴云发布基于NVIDIA Tesla A100 GPU的云服务器产品,据悉滴滴云是该型GPU云服务器产品的国内首发云厂商. 滴滴云基于A100 GPU的产品包括裸金属服务器(BMS ...

  6. adreno660 gpu相当于mali 什么型号的gpu

    很抱歉,我无法比较 Adreno 660 GPU 和 Mali GPU 的具体型号,因为这两个 GPU 并不完全相同.Adreno 660 是由 Qualcomm 推出的 GPU,而 Mali 是由 ...

  7. 显卡算力排行_RTX3090 时代最新GPU选购指南:哪款显卡配得上我的炼丹炉?

    ↑ 点击蓝字 关注极市平台作者丨Tim Dettmers 来源丨机器之心编辑丨极市平台 极市导读 近日,华盛顿大学博士Tim Dettmers发表文章,就深度学习从业者如何选购GPU的问题发表了看法. ...

  8. arm mali 天梯图_移动处理器GPU性能天梯图数据库

    手机gpu性能数据! 品牌处理器品牌GPU 苹果Apple A9X IMG PowerVR GT7800+苹果A10 Fusion IMG Apple G9 英伟达Tegra X1英伟达GM20B 2 ...

  9. ARM GPU Mali底层架构

    ARM作为移动计算领域实际上的掌控厂商,对移动计算产品未来的发展方向有着决定性的能力.在GPU的发展上,从一开始Mali系列的弱势到现在Mali已经成为诸多厂商的首选,ARM在Mali GPU架构的发 ...

最新文章

  1. 编写一个方法,找出两个数字中最大的那一个。不得使用if-else或其他比较运算符。...
  2. 高并发编程-线程生产者消费者的综合示例
  3. Expectation Maximization-EM(期望最大化)-算法以及源码
  4. 神经网络 | 基于脉冲耦合神经网络(PCNN)的图像特征提取(Matlab源代码)
  5. R eentrantLock的源码分析
  6. win7修改系统字体时需要修改的项目
  7. SAP Fiori Elements List Report table 里的普通按钮,Global 按钮 和 Determining 按钮
  8. refreshtoken用mysql_微信access_token和refresh_token保存于redis
  9. 最少换乘(最短路+恶心的输入)acm寒假集训日记22/1/3 or 22/1/4
  10. c++获得鼠标当前位置
  11. JDK8下maven使用maven-javadoc-plugin插件报错
  12. ubantu安装搜狗常见问题
  13. python批量打印_python 批量打印PDF
  14. 计算机流水线重要知识,计算机组成与体系结构——流水线相关知识点(常考计算)...
  15. zigbee基础应用(五)uart串口通信
  16. mysql动态ip域名连接_用本地动态IP连接本地mysql
  17. 338页网易Java面试真题解析火爆全网,面试真题解析
  18. AtCoder Beginner Contest 167 D Teleporter 找周期
  19. 交通行业舆情危机管理方案
  20. 新品发布 | 无人车开发平台Autopilot kit R300正式发布!

热门文章

  1. 2.阻容耦合静态工作点稳定电路的静态工作点及电压放大倍数测试
  2. JS中如何通过鼠标滚轮控制横向滚动轴滚动
  3. git merge合并分支解决冲突
  4. UIGU源码分析6:Toggle 和 ToggleGroup
  5. HightChart数据提示框(Tooltip)
  6. radio按扭设置只读_RadioButton控件
  7. python简单圣诞树手工折纸_圣诞树简单手工diy折纸图解教程
  8. 分割视频最简单的操作方法
  9. 植物2 IOS 怎么实名认证_【植物大战僵尸2国际版最新iOS版】植物大战僵尸2国际版iOS版下载...
  10. 我的第一篇随笔-英语(给他人的祝福)