2015-06-19 4 views
0

В моем ядре OpenCL я проверяю, находится ли global_id в глобальном размере проблемы, но он не работает.Workgroup Bound Check not working

Если глобальный размер проблемы делится на workgroupsize, все в порядке. Если нет, ядро ​​ничего не делает.

__kernel void move_points(const unsigned int points, 
           const unsigned int floors, 
           const unsigned int gridWidth, 
           const unsigned int gridHeight, 
           __global const GraphData *graph, 
           __global const float *pin_x, 
           __global const float *pin_y, 
           __global const float *pin_z, 
           __global float *pout_x, 
           __global float *pout_y, 
           __global float *pout_z, 
           __global clrngMrg31k3pHostStream *streams) 
{ 
    int id = get_global_id(0); 

    if (id < points) { 
     do kernel things... 
    } 
} 

Кто-нибудь знает, где проблема?

Большое спасибо. Робин.

ответ

4

Если ваш глобальный размер не делится на ваш локальный размер (размер рабочей группы), то ядро ​​не будет запускаться вообще.

Звонок enqueueNDRangeKernel() возвращает CL_INVALID_WORK_GROUP_SIZE как ошибку, указанную here.


Если вы действительно хотите следовать режиму CUDA, где у вас могут быть неиспользованные рабочие элементы. Затем поместите чек в ядро ​​(как вы уже знаете), и используйте более крупный глобальный размер, который кратен вашему локальному размеру.

+0

Хорошо, спасибо. В соответствии с этим, если я могу два изменить свой глобальный размер проблемы, лучше всего вычислить мои глобальные рабочие элементы как кратные максимальному рабочему классу устройства прямо? например, мой максимальный рабочий график равен 1024, тогда я устанавливаю свой глобальный размер проблемы на 1024 * 1000? – user3507003

+0

В общем случае, если можете, то ДА. Чем больше размер рабочей группы, тем выше загрузка устройства. Но не всегда, иногда лучше иметь меньший размер, чтобы иметь возможность хранить больше памяти на каждый рабочий элемент. Или, может быть, размер вашей локальной проблемы проще решить с другим размером группы. – DarkZeros

+0

совершенный. Большое спасибо! – user3507003