как простой тест, чтобы увидеть, работают ли функции 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.
Любая помощь приветствуется.
Я нашел решение своей проблемы.
clBuildProgram по умолчанию будет использовать самую высокую версию компилятора OpenCL C. 1. Если опция "-cl-std = CL2.0" не указана в части параметров вызова API clBuildProgram.
Компилятор OpenCL C предназначен для кода ядра на стороне устройства и отдельно от компиляции Host-side. Необходимо указать вручную OpenCL 2.0, если они захотят его использовать.