作为一个简单的测试,看看OpenCL 2.0函数是否适合我,我写了一个调用work_group_barrier的小内核。但是,对于我的生活,我无法弄清楚为什么内核变得无效 考虑到如果"屏障"内核将是有效的。使用,work_group_barrier只是一个重命名的屏障版本,这没有意义。
有问题的内核:
#pragma OPENCL EXTENSION cl_amd_printf : enable
#pragma OPENCL EXTENSION cl_khr_subgroups : enable
//pragmas go here
#define TRUE 1
#define FALSE 0
__kernel void my_dumb_test(
__global float *in0,
__global float *in1,
__global float *out
){
int global_num = get_global_id(0);
int local_num = get_local_id(0);
int local_size = get_local_size(0);
int global_size = get_global_size(0);
int group_id = get_group_id(0);
int group_num = get_num_groups(0);
local int a;
int b = 2;
//a = work_group_broadcast(b, local_num);
//uint sub_group_size = get_sub_group_size();
//printf("in0[%d]: %f\n", global_num, in0[global_num]);
//printf("max sub group size: %d\n", sub_group_size);
//work_group_barrier(CLK_GLOBAL_MEM_FENCE);
//barrier(CLK_GLOBAL_MEM_FENCE);
printf("global id: %d local id: %d group id: %d num groups %d\n", global_num, local_num, group_id, group_num);
}
有趣的是,主机端的OpenCL 2.0功能正常运行。使用clCreateCommandQueueWithProperties返回成功。在早期版本的OpenCL中,此函数以clCreateCommandQueue的形式存在。 CL_DEVICE_VERSION追回OpenCL 2.0。我正在使用AMD Radeon R9 290X 4GB GDDR5,运行Ubuntu 14.04,最新的驱动程序和AMD-APP-SDK 3.0测试版。
感谢任何帮助。
答案 0 :(得分:1)
我找到了解决问题的方法。
如果选项" -cl-std = CL2.0" clBuildProgram将默认为OpenCL C编译器1.X的最高版本。未在clBuildProgram API调用的options部分中指定。OpenCL C编译器用于设备端内核代码,与主机端编译分开。如果他们选择使用OpenCL 2.0,则必须手动指定。