Лучший способ отладки ядра OpenCL - PullRequest
1 голос
/ 13 марта 2019

У меня следующее ядро ​​openCL, которое я хочу отладить.Я добавил в него некоторые функции printf, но они бесполезны, так как рабочие элементы являются случайными графиками, а напечатанные значения не всегда правильны.Как я могу заставить мои рабочие элементы в ядре выполняться последовательно для отладки?

Ниже приведен код

__kernel
void SampleKernel( __global float4* gVtx,  __global float4* gColor,  
                 __global float4* gDst,
                 const int cNvtx, 
                 const int4 cRes )
                 {
                   printf("nVertex : %d ", cNvtx);

                   for(int i =0 ; i < 1; i+=4)
                   {

                   printf(" %f ",  gVtx[0].x);

                   printf(" %f ",  gVtx[0].y);

                   printf(" %f ",  gVtx[0].z);

                   printf(" %f ",  gVtx[0].w);

                   }

                 }

Я также пытался помещать вызовы barrier(CLK_LOCAL_MEM_FENCE | CLK_GLOBAL_MEM_FENCE); до и после printf, ноэто было бесполезно.Кто-нибудь может предложить мне способ сериализации выполнения рабочего элемента, чтобы я мог печатать и отлаживать ядро?Или другой лучший способ отладки ядра OpenCL.Я использую RX 580 AMD GPU.

1 Ответ

2 голосов
/ 14 марта 2019

Некоторые предложения: вы можете использовать глобальный идентификатор и идентификатор группы для управления тем, какой поток печатать, а при печати также выводить на печать поток и идентификатор группы.Это значительно снизит сложность печатной информации и даст вам больше контроля над информацией, которая вам может понадобиться.

Еще один совет: попробуйте сгруппировать несколько отпечатков в один, если это возможно;например, это не очень хороший метод отладки, если мы используем print следующим образом

               printf(" %f ",  gVtx[0].x);

               printf(" %f ",  gVtx[0].y);

               printf(" %f ",  gVtx[0].z);

               printf(" %f ",  gVtx[0].w);

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

С двумя приведенными выше советами может быть проще работать с ядрами отладки.

...