, поэтому я могу скомпилировать и выполнить мое ядро, проблема в том, что используются только два рабочих элемента. Я в основном пытаюсь заполнить массив float [8] с помощью {0,1,2,3,4,5,6,7}. Так что это очень простое приложение для приветствия. Беллоу - мое ядро.Не все рабочие элементы используются opencl
// Highly simplified to demonstrate
__kernel void rnd_float32_matrix (
__global float * res
) {
uint idx = get_global_id(0);
res[idx] = idx;
}
затем создать и выполнить ядро со следующим кодом ...
// Some more code
cl::Program program(context, sources, &err);
program.build(devices, NULL, NULL, NULL);
cl::Kernel kernel(program, "rnd_float32_matrix", &err);
kernel.setArg(0, src_d);
cl::CommandQueue queue(context, devices[0], 0, &err);
cl::Event event;
err = queue.enqueueNDRangeKernel(
kernel,
cl::NullRange,
cl::NDRange(8),
// I've tried cl::NDRange(8) as well
cl::NDRange(1),
NULL,
&event
);
event.wait();
err = queue.enqueueReadBuffer(
// This is:
// cl::Buffer src_d(
// context,
// CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,
// mem_size,
// src_h,
// &err);
src_d,
CL_TRUE,
0,
8,
// This is float * src_h = new float[8];
src_h);
for(int i = 0; i < 8; i ++) {
std::cout << src_h[i] << std::endl;
}
Я не могу показать его в коде, но я также выбрать видеочипа устройство и с помощью context.getInfo (..) он показывает, что я использую свою карту NVidia GTX 770M, которая показывает 1024, 1024, 64 рабочих элемента, доступных в размерах 0, 1 и 2. Когда этот массив печатает, я продолжаю получать ... 0, 1, 0, 0, 0, 0, 0, 0. Я также попытался установить res [idx] = 5, и я получаю ... 5, 5, 0, 0, 0, 0, 0, 0. Так что кажется, что только два дают рабочие предметы на самом деле используются. Что я делаю не так?
Думаю, вы слишком упростили свою программу. 'res [idx] = inSeed' неясно, поскольку инициализация' inSeed' не показана. – Christian
Попробуйте создать 'src_d' флаг' CL_MEM_READ_WRITE' вместо 'CL_MEM_READ_ONLY'. – sgarizvi
@Christian: Спасибо, это должно быть res [idx] = idx; –