在英特尔 iGPU 上测量内核内部时间

Measuring Time inside kernel on intel iGPU

我是 OpenCL 的新手,但是我在使用 CUDA 进行 GPU 编程方面有相当多的经验。我曾经使用 CUDA 内核中的时钟函数(如 here 中所述)来测量内核中某些操作的滴答声。我写了一个简单的 OpenCL 矢量加法内核,并尝试 运行 它在 intel 集成 GPU 上。该程序 运行 很好,并给出了正确的输出。但是后来我尝试在内核函数中使用时钟函数,并且在执行 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 中执行此操作,因为它支持时钟功能。但类似的目标并未通过英特尔 iGPU 实现。我还尝试了其他功能来测量滴答声,但其中 none 也能正常工作。我也尝试使用 ioc64 进行离线编译,但我遇到了同样的错误。我只是想知道是否有人可以告诉我我在这里做错了什么,或者在英特尔集成 GPU 中无法使用时钟(或类似)功能获取滴答声。得到这个执行痕迹对我来说是绝对必要的。因此,如果使用时钟功能不是一个可行的选择,那么我想知道在这里实现相同目标的替代选项是什么,我该如何使用它?谢谢。

我已经在英特尔 opencl 论坛中 post 编辑了这个,那里已经提供了解决方案。请关注此论坛 post link 以找到答案。如果您有以下任何问题,可以在此处或英特尔论坛中post。谢谢