OpenCL环境下GPU计算中子区域形状与工作组大小的性能影响探究
OpenCL二维数组子区域计算性能分析
背景
假设使用OpenCL作为编程接口,现有一个大小为10241024的二维数组,需对其子区域进行计算操作。由于内存中实际仅以一维数组的**行优先(row major)或列优先(column major)**形式存储二维数组,因此形状为10241与11024的子区域存在本质差异:其中一种是连续内存块*,另一种则是1024个离散元素,相邻元素间存在1023*sizeof(datatype)的内存间隙。
问题
基础问题
这两种场景下的GPU计算性能是否存在差异?
进阶问题
以下两段代码的执行性能是否不同?请给出详细原因。
enqueueNDRangeKernel(doSomething,offset(0,0),globalSize(1024,1024), workGroupSize(1,1024)); enqueueNDRangeKernel(doSomething,offset(0,0),globalSize(1024,1024), workGroupSize(1024,1));
实验结果
实验使用的Kernel仅为简单的元素+1操作,二维数组为float[8192][8192],耗时结果通过CL_PROFILING_COMMAND_[END-START]获取,单位为纳秒(ns):
//Kernel function is a simple +1; 2D array is float[8192][8192]; result is ns by CL_PROFILING_COMMAND_[END-START] WorkingArea:(1,8192), LocalGroup:(1,1024): result is: 4096 result is: 6880 result is: 4096 result is: 7040 result is: 3840 result is: 11264 result is: 7072 result is: 6912 result is: 4096 result is: 3936 result is: 4096 result is: 6720 result is: 11264 result is: 30720 result is: 11264 result is: 6976 WorkingArea:(32,8192), LocalGroup:(1,1024): result is: 8192 result is: 14336 result is: 14016 result is: 13248 result is: 13312 result is: 13216 result is: 9216 result is: 13216 result is: 9216 result is: 19392 result is: 9216 result is: 9920 result is: 27744 result is: 7168 result is: 6272 result is: 7168 WorkingArea:(32,8192), LocalGroup:(32, 32): result is: 22528 result is: 30720 result is: 30336 result is: 29728 result is: 30720 result is: 25600 result is: 30368 result is: 30496 result is: 25600 result is: 29696 result is: 28672 result is: 30720 result is: 22624 result is: 26240 result is: 26304 result is: 25536 WorkingArea:(8192,1), LocalGroup:(1024,1): result is: 5120 result is: 8288 result is: 13312 result is: 8192 result is: 13088 result is: 8192 result is: 8288 result is: 9152 result is: 8192 result is: 13152 result is: 13152 result is: 12288 result is: 8192 result is: 8192 result is: 8192 result is: 13312 WorkingArea:(8192,32), LocalGroup:(1024,1): result is: 28672 result is: 32512 result is: 31712 result is: 32448 result is: 31744 result is: 32480 result is: 32544 result is: 31744 result is: 28512 result is: 31744 result is: 31616 result is: 31744 result is: 36736 result is: 39744 result is: 32480 result is: 28672 WorkingArea:(8192,32), LocalGroup:(32,32): result is: 22528 result is: 25504 result is: 25536 result is: 22400 result is: 23552 result is: 25248 result is: 22528 result is: 32416 result is: 29696 result is: 30304 result is: 29696 result is: 51200 result is: 22528 result is: 36864 result is: 25344 result is: 22528 WorkingArea:(8192,8192), LocalGroup:(1,1024): result is: 1462304 result is: 1466048 result is: 1461824 result is: 1461952 result is: 1462272 result is: 1465344 result is: 2147328 result is: 1750016 result is: 1712896 result is: 1465184 result is: 1465344 result is: 1465184 result is: 1471456 result is: 1466080 result is: 1466240 result is: 1461248 WorkingArea:(8192,8192), LocalGroup:(1024,1): result is: 14011392 result is: 11673280 result is: 11722560 result is: 11153120 result is: 12884992 result is: 11982464 result is: 10938368 result is: 10518528 result is: 11044864 result is: 10567680 result is: 10782720 result is: 10988544 result is: 11358208 result is: 10978304 result is: 11260928 result is: 11233984 WorkingArea:(8192,8192), LocalGroup:(32,32): result is: 4443136 result is: 4447072 result is: 4794368 result is: 4631552 result is: 4835104 result is: 4982784 result is: 4439616 result is: 4426752 result is: 4438720 result is: 4892416 result is: 4482048 result is: 4692672 result is: 5634048 result is: 4432480 result is: 4477920 result is: 4654080
实验结论
- WorkingArea:(1,8192)与WorkingArea:(32,8192):相同工作组划分下,计算量提升32倍(从1行到32行),但耗时仅增加约1.5倍,呈非线性缩放。这是因为GPU具备大规模并行计算能力,多线程并行执行摊薄了内存访问和调度的固定开销。
- 整体趋势:工作组从(1,1024)变为(1024,1)时,耗时单调递增,最高达约8倍;(32,32)工作组耗时约为(1,1024)的3倍,接近√8。核心原因是内存访问连续性:
- 当工作组为(1,1024)时,每个工作线程访问的是行优先存储中的连续内存块,GPU内存控制器可高效执行连续内存读写,利用缓存行预取机制大幅降低内存延迟。
- 当工作组为(1024,1)时,每个工作线程访问的是列方向的离散元素,内存地址跨度为
8192*sizeof(float)(对应数组行长度),属于非合并访问,无法利用缓存预取,每次内存访问都需单独发起请求,导致内存带宽利用率极低,性能大幅下降。 - (32,32)工作组模式介于两者之间,内存访问连续性不如(1,1024),但优于(1024,1),因此耗时也处于中间水平。
基础问题解答
两种场景下GPU计算性能存在显著差异:访问连续内存块的场景性能远高于访问离散元素的场景,核心差异源于内存访问的合并效率和缓存利用率。
进阶问题解答
两段代码执行性能差异明显,workGroupSize(1,1024)的性能远优于workGroupSize(1024,1)。原因如上所述:前者对应行优先存储的连续内存访问,能充分利用GPU的内存合并访问和缓存预取机制;后者对应列方向的离散内存访问,属于非合并访问,内存带宽利用率极低,导致执行时间大幅增加。
内容的提问来源于stack exchange,提问作者Zackham
相关产品推荐
相关产品推荐

