我目前正在优化 OpenCL 内核,并一直在尝试为工作组大小和向量宽度找到最佳值。
目前我正在使用带有 Intel i7-3930k(6 核 @ 3.5 GHz,HT 禁用)和 AMD HD6870 的 ubuntu 系统。安装了 Intel 和 AMD OpenCL 实现以进行比较。(AMD APP SDK v2.7 Linux 64b & Catalyst 12.4,英特尔 OpenCL SDK 1.5)。
在 CPU 上运行(在 Intel 平台上)我发现:
- 通过选择 256 的 wg 大小,与 wgsize=1 相比,我可以获得大约 13.5% 的性能。
- 通过指定
__attribute__((vec_type_hint(float4)))
我可以获得 30% 的提升。 - 通过指定
__attribute__((work_group_size_hint(WG_SIZE, 1, 1)))
我得到另一个〜90%(!)
因此,总的来说,这些选项可以使性能提高近 3 倍。不幸的是,在使用 AMD OpenCL 平台的 CPU 上运行这个案例时,我发现可选属性被忽略了。
内核声明为:
kernel __attribute__(( work_group_size_hint(WG_SIZE, 1, 1) ))
__attribute__(( vec_type_hint(VEC_SIZE) ))
void solveEikonalEq( global env_packed_t* env_packed_in,
global float* packedEnvData_in,
private float ds,
private float freq,
global ray_t* ray,
global rayMembers_t* rayMembers){
编译器输出为:
"/tmp/OCLVAvDqR.cl", line 2637: warning: unknown attribute "work_group_size_hint"
kernel __attribute__((work_group_size_hint(WG_SIZE, 1, 1)))
^
"/tmp/OCLVAvDqR.cl", line 2638: warning: unknown attribute "vec_type_hint"
__attribute__(( vec_type_hint(VEC_SIZE)))
^
有人知道 AMD 是否总是忽略这些提示吗?或者我必须做些什么才能在 AMD 平台上启用这些属性?