关于mali-T860这款GPU的带宽问题
问题遇到的现象和发生背景
我有一块开发板使用的是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的带宽问题相关推荐
- 超越英伟达的,不会是另一款GPU?这家深圳公司发布全球首款数据流AI芯片
2020年6月23日,鲲云科技在深圳举行产品发布会,发布全球首款数据流AI芯片CAISA,定位于高性能AI推理,已完成量产. 鲲云通过自主研发的数据流技术在芯片实测算力上实现了技术突破,较同类产品在芯 ...
- 超越英伟达的,不会是另一款GPU!中国公司发布首款数据流AI芯片
2020年6月23日,鲲云科技在深圳举行产品发布会,发布全球首款数据流AI芯片CAISA,定位于高性能AI推理,已完成量产.鲲云通过自主研发的数据流技术在芯片实测算力上实现了技术突破,较同类产品在芯片 ...
- HP Xeon 55xx上GPU的带宽问题
HP Xeon 55xx的服务器上NVIDIA GPU的带宽问题 但是通过SDK的带宽测试,数值比较奇怪. host -> device 最高不到3GB/S, device-> host ...
- 英伟达的这款GPU太强了!
点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 今年 3 月 21 日 - 24 日举办的 NVIDIA GTC 2022 大会可谓是亮点十足.NVIDIA ...
- gpu云服务器运行游戏_滴滴云不甘寂寞,国内首发一款GPU云服务器
北京时间9月1日,滴滴云发布基于NVIDIA Tesla A100 GPU的云服务器产品,据悉滴滴云是该型GPU云服务器产品的国内首发云厂商. 滴滴云基于A100 GPU的产品包括裸金属服务器(BMS ...
- adreno660 gpu相当于mali 什么型号的gpu
很抱歉,我无法比较 Adreno 660 GPU 和 Mali GPU 的具体型号,因为这两个 GPU 并不完全相同.Adreno 660 是由 Qualcomm 推出的 GPU,而 Mali 是由 ...
- 显卡算力排行_RTX3090 时代最新GPU选购指南:哪款显卡配得上我的炼丹炉?
↑ 点击蓝字 关注极市平台作者丨Tim Dettmers 来源丨机器之心编辑丨极市平台 极市导读 近日,华盛顿大学博士Tim Dettmers发表文章,就深度学习从业者如何选购GPU的问题发表了看法. ...
- arm mali 天梯图_移动处理器GPU性能天梯图数据库
手机gpu性能数据! 品牌处理器品牌GPU 苹果Apple A9X IMG PowerVR GT7800+苹果A10 Fusion IMG Apple G9 英伟达Tegra X1英伟达GM20B 2 ...
- ARM GPU Mali底层架构
ARM作为移动计算领域实际上的掌控厂商,对移动计算产品未来的发展方向有着决定性的能力.在GPU的发展上,从一开始Mali系列的弱势到现在Mali已经成为诸多厂商的首选,ARM在Mali GPU架构的发 ...
最新文章
- 编写一个方法,找出两个数字中最大的那一个。不得使用if-else或其他比较运算符。...
- 高并发编程-线程生产者消费者的综合示例
- Expectation Maximization-EM(期望最大化)-算法以及源码
- 神经网络 | 基于脉冲耦合神经网络(PCNN)的图像特征提取(Matlab源代码)
- R eentrantLock的源码分析
- win7修改系统字体时需要修改的项目
- SAP Fiori Elements List Report table 里的普通按钮,Global 按钮 和 Determining 按钮
- refreshtoken用mysql_微信access_token和refresh_token保存于redis
- 最少换乘(最短路+恶心的输入)acm寒假集训日记22/1/3 or 22/1/4
- c++获得鼠标当前位置
- JDK8下maven使用maven-javadoc-plugin插件报错
- ubantu安装搜狗常见问题
- python批量打印_python 批量打印PDF
- 计算机流水线重要知识,计算机组成与体系结构——流水线相关知识点(常考计算)...
- zigbee基础应用(五)uart串口通信
- mysql动态ip域名连接_用本地动态IP连接本地mysql
- 338页网易Java面试真题解析火爆全网,面试真题解析
- AtCoder Beginner Contest 167 D Teleporter 找周期
- 交通行业舆情危机管理方案
- 新品发布 | 无人车开发平台Autopilot kit R300正式发布!
热门文章
- 2.阻容耦合静态工作点稳定电路的静态工作点及电压放大倍数测试
- JS中如何通过鼠标滚轮控制横向滚动轴滚动
- git merge合并分支解决冲突
- UIGU源码分析6:Toggle 和 ToggleGroup
- HightChart数据提示框(Tooltip)
- radio按扭设置只读_RadioButton控件
- python简单圣诞树手工折纸_圣诞树简单手工diy折纸图解教程
- 分割视频最简单的操作方法
- 植物2 IOS 怎么实名认证_【植物大战僵尸2国际版最新iOS版】植物大战僵尸2国际版iOS版下载...
- 我的第一篇随笔-英语(给他人的祝福)