【发布时间】:2015-05-04 18:34:02
【问题描述】:
作为查看 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 ping OpenCL 2.0。我正在使用 AMD Radeon R9 290X 4GB GDDR5、Ubuntu 14.04、最新驱动程序和 AMD-APP-SDK 3.0 beta 运行。
感谢任何帮助。
【问题讨论】:
-
无效是什么意思——是编译失败还是运行失败?
-
整个程序编译,但是执行时,程序返回OpenCL状态错误。我在主机程序的每一步都探测状态整数指示器。每当内核出现问题时,OpenCL 的状态指示器都会显示一条消息。在这种情况下,错误消息从 clBuildProgram 开始,当取消注释 work_group_barrier 时返回“CL_BUILD_PROGRAM_ERROR”。