Я изучаю opencl, но в одном из моих тестов я пытался использовать work_group_reduce_add, чтобы добавить 3 плавающих значения массива (1.5f, 1.5f, 1.5f), результат, который я ожидал, составлял 4.5f, максимум - 4.0 е. И когда я пробую матрицу с 2 значениями (1.5f, 1.0f), результатом будет ожидаемое значение 2.5f, но когда я пытаюсь использовать больше значений из третьего элемента матрицы, плавающие значения начинают обрабатываться как целые числа. Мой код чуть ниже.
std::vector<cl::Platform> plataforms;
cl::Platform::get(&plataforms);
std::vector<cl::Device> devices;
plataforms.front().getDevices(CL_DEVICE_TYPE_GPU, &devices);
cl::Context context(devices.front());
const char* code = "\
__kernel void test(__global float* a, __global float* b) {\
b[0] = work_group_reduce_add(a[get_global_id(0)]);\
}\
";
cl::Program::Sources src(1, std::make_pair(code, strlen(code)));
cl::Program program(context, src);
program.build("-cl-std=CL2.0");
cl::CommandQueue queue_default(context, devices.front(), CL_QUEUE_ON_DEVICE | CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE | CL_QUEUE_ON_DEVICE_DEFAULT);
cl::CommandQueue queue(context, devices.front());
cl::Kernel kernel_test(program, "test");
float a[3] = { 1.5f, 1.5f, 1.5f };
float b[1] = { 0.0f };
cl::Buffer _a(context, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, sizeof(float) * 3, a);
cl::Buffer _b(context, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, sizeof(float), b);
kernel_test.setArg(0, _a);
kernel_test.setArg(1, _b);
queue.enqueueNDRangeKernel(kernel_test, cl::NDRange(), cl::NDRange(3), cl::NDRange(3));
queue.finish();
Я также изменил матрицу на (1.0f, 1.5f, 4.6f) и изменил код на test work_group_reduce_max () и ожидал результата 4.6f, но это обеспечило 4.0f = /
__kernel void test(__global float* a, __global float* b) {
float val = a[get_global_id(0)];
float result = work_group_reduce_max(val);
b[0] = result;
}