工作组屏障不起作用

work group barrier not working

本文关键字:不起作用 工作组      更新时间:2023-10-16

作为一个简单的测试,看看OpenCL 2.0函数是否适合我,我编写了一个小内核,它调用work_group_barrier。然而,对于我来说,我不明白内核为什么会失效
考虑到如果使用"barrier",内核将是有效的,而work_group_barrier只是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]: %fn", global_num, in0[global_num]);
//printf("max sub group size: %dn", 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 %dn", global_num, local_num, group_id, group_num);
}

有趣的是,主机端的OpenCL2.0功能可以正常工作。使用clCreateCommandQueueWithProperties返回成功。在旧版本的OpenCL中,此函数以clCreateCommandQueue的形式存在。CL_DEVICE_VERSION返回OpenCL 2.0。我运行的是AMD Radeon R9 290X 4GB GDDR5,运行的是Ubuntu 14.04,带有最新的驱动程序和AMD-APP-SDK 3.0测试版。

感谢您的帮助。

我已经找到了问题的解决方案。

如果在clBuildProgram API调用的选项部分中未指定选项"-cl-sd=CL2.0",则clBuildProgram将默认为OpenCL C编译器1.X的最高版本。

OpenCL C编译器用于设备端内核代码,与主机端编译是分开的。如果选择使用OpenCL 2.0,则必须手动指定它。