OpenCL get_global_id с неправильным результатом - PullRequest
0 голосов
/ 16 октября 2018

У меня проблема с неправильным global_id() результатом.Я хотел бы свернуть трехмерный воксель с размером {35,35,35} с трехмерным ядром с размером {5,5,5}.Поэтому я вызываю «clEnqueueNDRangeKernel» с global_size = {35,35,35} и local size = { 5, 5, 5}

std::vector<size_t> local_nd  = { 5, 5, 5 };
std::vector<size_t> global_nd = { 35, 35, 35 };
err = clEnqueueNDRangeKernel( queue, hello_kernel, work_dim, NULL, global_nd.data(), local_nd.data(), 0, NULL, NULL); 

То, что я ожидаю при вызове get_global_id(), функция global_id(0) должна быть в диапазоне от 0 до 34 global_id(1) должно бытьот 0 до 34 и global_id(2) должно быть от 0 до 34.

Однако для global_id(0) and global_id(1) результаты кажутся правильными.Тем не менее, global_id(2) значения варьируются от 30 до 34 вместо ожидаемых от 0 до 34.

const int  ic0     =  get_global_id(0);  // icol
const int  ic1     =  get_global_id(1);  // irow  
const int  ic2     =  get_global_id(2);  // idep 


printf(" %d %d %d\n", ic0, ic1, ic2 ); 
// value of ic0 = [0  -> 34] correct!
// value of ic1 = [0  -> 34] correct!
// value of ic2 = [30 -> 34]  ( SHOULD IT BE [0->34] )?

мой gpu is max-workgroup является максимальным элементом рабочей группы ND: {1024, 1024, 64}

1 Ответ

0 голосов
/ 16 октября 2018

Я нашел проблему, как предложил pmdj.

printf in kernels isn't always reliable - there's often a fixed-size buffer, and if you output too much, some messages may be dropped.

После того, как я изменил код OpenCL с некоторыми условиями.например:

if( ic2< 10 )
    printf("ic2: %d ", ic2 );

Выходные значения варьируются от [0 -> 34, как я ожидал]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...