OpenCL 2.0完整配置下无法使用atomic_store/atomic_load?求排查
OpenCL 2.0中atomic_store/atomic_load编译报错的解决方法
环境信息
- 平台版本:OpenCL 2.1 AMD-APP (3570.0)
- 设备名称:gfx90c
- 设备配置:FULL_PROFILE
- 设备版本:OpenCL 2.0 AMD-APP (3570.0)
- OpenCL C版本:OpenCL C 2.0
- 支持的扩展:包含
cl_khr_global_int32_base_atomics等原子操作扩展
问题代码
// probably useless #pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable #pragma OPENCL EXTENSION cl_khr_global_int32_extended_atomics : enable #pragma OPENCL EXTENSION cl_khr_fp64 : enable void vector_is_zero_partial( uint row, uint row_to, __global const double *x, double tolerance, __global atomic_int *is_zero) { for (; row < row_to; ++row) { if (fabs(x[row]) > tolerance) { atomic_store(is_zero, 0); break; } if (!atomic_load(is_zero)) break; } }
编译错误
C:\Users\CHAMEL~1\AppData\Local\Temp\\OCL8036T0.cl:264:4: error: implicit declaration of function 'atomic_store' is invalid in C99 atomic_store(is_zero, 0); ^ C:\Users\CHAMEL~1\AppData\Local\Temp\\OCL8036T0.cl:267:8: error: implicit declaration of function 'atomic_load' is invalid in C99 if (!atomic_load(is_zero)) break; ^ 2 errors generated. error: Clang front-end compilation failed! Frontend phase failed compilation. Error: Compiling CL to IR
问题原因与解决方法
原因
问题出在AMD APP SDK 3570.0版本的编译器对OpenCL C 2.0引入的通用原子操作函数(atomic_store/atomic_load)和atomic_int类型支持不完善。即便设备标称支持OpenCL 2.0,旧编译器仍可能默认以C99/OpenCL 1.x标准编译,无法识别这些新特性。
解决方法
1. 显式指定OpenCL C 2.0编译标准
在使用OpenCL.NET编译程序时,添加编译选项-cl-std=CL2.0,强制编译器以OpenCL C 2.0标准处理代码。
OpenCL.NET中编译程序的代码示例(需补充该选项):
var buildOptions = "-cl-std=CL2.0"; var errorCode = Cl.BuildProgram(program, deviceCount, devices, buildOptions, null, IntPtr.Zero);
2. 回退到扩展原子函数(兼容旧编译器)
如果指定CL2.0标准后仍报错,可改用cl_khr_global_int32_base_atomics扩展提供的原子函数,同时将atomic_int替换为普通的volatile int指针:
修改后的代码:
#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable #pragma OPENCL EXTENSION cl_khr_fp64 : enable void vector_is_zero_partial( uint row, uint row_to, __global const double *x, double tolerance, __global volatile int *is_zero) { for (; row < row_to; ++row) { if (fabs(x[row]) > tolerance) { // 用atomic_xchg实现原子存储0 atomic_xchg(is_zero, 0); break; } // 用atomic_add加0实现原子读取当前值 if (!atomic_add(is_zero, 0)) break; } }
3. 验证扩展支持
可尝试在编译选项中添加-Dcl_khr_global_int32_base_atomics,显式定义扩展宏,帮助编译器识别相关函数。
内容的提问来源于stack exchange,提问作者Chameleon
相关产品推荐
相关产品推荐

