【问题标题】:work group barrier not working工作组障碍不起作用
【发布时间】: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”。

标签: c++ ubuntu opencl gpu


【解决方案1】:

我找到了解决问题的方法。

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

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

【讨论】:

  • 现在唯一的问题是我添加选项时出现了段错误。
猜你喜欢
  • 1970-01-01
  • 2023-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多