2015-05-07 3 views
0

, поэтому я могу скомпилировать и выполнить мое ядро, проблема в том, что используются только два рабочих элемента. Я в основном пытаюсь заполнить массив 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. Так что кажется, что только два дают рабочие предметы на самом деле используются. Что я делаю не так?

+0

Думаю, вы слишком упростили свою программу. 'res [idx] = inSeed' неясно, поскольку инициализация' inSeed' не показана. – Christian

+0

Попробуйте создать 'src_d' флаг' CL_MEM_READ_WRITE' вместо 'CL_MEM_READ_ONLY'. – sgarizvi

+0

@Christian: Спасибо, это должно быть res [idx] = idx; –

ответ

3

Ваша команде считывания данных из устройства только чтение 8 байт, который состоит из двух поплавков:

err = queue.enqueueReadBuffer(
    src_d, 
    CL_TRUE, 
    0, 
    8, // <- This is the number of bytes, not the number of elements! 
    // This is float * src_h = new float[8]; 
    src_h); 

Для чтения 8 поплавков, вам нужно будет сделать это:

err = queue.enqueueReadBuffer(
    src_d, 
    CL_TRUE, 
    0, 
    8 * sizeof(cl_float), 
    // This is float * src_h = new float[8]; 
    src_h); 
+0

Ха-ха, я знаю! Я перепутался, и я понял это позже, но это, безусловно, проблема! Я все еще думаю о мире сценариев. Спасибо, что нашли время! –

Смежные вопросы