You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 14:03:07