在Intel iGPU上测量内核内部时间

时间:2018-11-05 01:13:28

标签: gpu opencl intel gpgpu

我是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并没有实现类似的目标。我还尝试了其他功能来测量刻度线,但是它们都无法正常工作。我也尝试使用ioc64进行脱机编译,但出现相同的错误。我只是想知道是否有人可以告诉我我在这里做错了什么,还是无法在英特尔集成GPU中使用时钟(或类似功能)获取报价。对我而言,绝对有必要获取此执行跟踪。因此,如果使用时钟功能不是一个可行的选择,那么我想知道在这里实现相同目标的替代选择是什么,我该如何使用呢?谢谢。

1 个答案:

答案 0 :(得分:0)

我已在intel opencl论坛上发布了此问题,并在那里提供了解决方案。请关注此论坛帖子link来找到答案。如果您有以下任何疑问,可以在此处或在英特尔论坛中发帖。谢谢。