OpenCL2 work_group_reduce_add с плавающей точкой неверный вывод - PullRequest
1 голос
/ 28 апреля 2020

Я изучаю 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;
}
...