Я очень новичок в OpenCL, однако у меня достаточно опыта в программировании на GPU с использованием CUDA. Раньше я использовал функцию часов внутри ядра CUDA (как упомянуто в здесь ) для измерения тактов определенных операций внутри ядра. Я написал простое векторное ядро с добавлением OpenCL и попытался запустить его на интегрированном графическом процессоре Intel. Программа работает нормально и выдает правильный вывод. Но затем я попытался использовать функцию часов внутри функции ядра, и при выполнении clBuildProgram произошла ошибка компиляции JIT. Ядро сложения векторов, которое я хотел выполнить, приведено ниже:
__kernel void testVecAdd(__global const int *a,__global const int *b,__global int *c,
__global float *t){
clock_t start = clock();
int gid = get_global_id(0);
c[gid] = a[gid] + b[gid];
t[gid] = (float)(clock()-start)/CLOCKS_PER_SEC;
}
Ошибки следующие:
/home/duttasankha/Desktop/SANKHA_ALL/IGPU_RESEARCH_RELATED/OCL_PRAC_DIR/test_OCL_1.cl:6:2: error: use of undeclared identifier 'clock_t'
clock_t start = clock();
^
/home/duttasankha/Desktop/SANKHA_ALL/IGPU_RESEARCH_RELATED/OCL_PRAC_DIR/test_OCL_1.cl:11:19: error: implicit declaration of function 'clock' is invalid in OpenCL
t[gid] = (float)(clock()-start)/CLOCKS_PER_SEC;
^
/home/duttasankha/Desktop/SANKHA_ALL/IGPU_RESEARCH_RELATED/OCL_PRAC_DIR/test_OCL_1.cl:11:27: error: use of undeclared identifier 'start'; did you mean 'sqrt'?
t[gid] = (float)(clock()-start)/CLOCKS_PER_SEC;
^~~~~
sqrt
CTHeader.h:5277:40: note: 'sqrt' declared here
double16 __attribute__((overloadable)) sqrt(double16);
^
/home/duttasankha/Desktop/SANKHA_ALL/IGPU_RESEARCH_RELATED/OCL_PRAC_DIR/test_OCL_1.cl:11:27: error: taking address of function is not allowed
t[gid] = (float)(clock()-start)/CLOCKS_PER_SEC;
^
/home/duttasankha/Desktop/SANKHA_ALL/IGPU_RESEARCH_RELATED/OCL_PRAC_DIR/test_OCL_1.cl:11:34: error: use of undeclared identifier 'CLOCKS_PER_SEC'
t[gid] = (float)(clock()-start)/CLOCKS_PER_SEC;
^
Failed to build program...: -11 (CL_BUILD_PROGRAM_FAILURE)
Build failed!
Я смог сделать это в CUDA, так как он поддерживает функцию часов. Но аналогичные цели не были достигнуты с Intel iGPU. Я также пробовал другие функции для измерения тиков, но ни одна из них не работала так же хорошо. Я также пробовал автономную компиляцию с использованием ioc64, но я получил те же ошибки. Мне просто интересно, может кто-нибудь сказать мне, есть ли что-то не так, что я здесь делаю или получение тиков с использованием функций часов (или аналогичных) невозможно в интегрированном графическом процессоре Intel. Это абсолютно необходимо для меня, чтобы получить следы этого выполнения. Так что, если использование функции часов не является жизнеспособным вариантом, то мне было интересно, какой будет альтернативный вариант для достижения тех же целей и как я могу его использовать? Спасибо.