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

Posted

技术标签:

【中文标题】在英特尔 iGPU 上测量内核内的时间【英文标题】:Measuring Time inside kernel on intel iGPU 【发布时间】:2019-04-08 09:10:18 【问题描述】:

我对 OpenCL 很陌生,但是我在使用 CUDA 进行 GPU 编程方面有相当多的经验。我曾经在 CUDA 内核中使用时钟函数(如here 中所述)来测量内核中某些操作的滴答声。我写了一个简单的 OpenCL 向量加法内核,并尝试在英特尔集成 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 中无法使用时钟(或类似)功能获取滴答声。我绝对有必要得到这个执行痕迹。因此,如果使用时钟功能不是一个可行的选项,那么我想知道在这里实现相同目标的替代选项是什么,我该如何使用它?谢谢。

【问题讨论】:

是什么让您相信 OpenCL 支持 clock()。 10 秒搜索 OpenCL 2.0 规范表明它不是。 clock() in opencl的可能重复 @talonmies 谢谢你的 cmets..但是你的 cmets 仍然没有回答这个问题,因为我正在寻找类似于时钟的东西......正如我已经说过的那样,很明显不支持时钟或类似功能......所以有类似目的的东西......这篇论文(comparch.gatech.edu/hparch/papers/gera_ispass18.pdf)提到了 GTPin 工具...... 这不是一个答案。我正在尝试了解发布一堆您显然已经知道的错误消息和代码的目的是什么,这些错误消息和代码不起作用? 当我反复说我正在寻找实现类似目标的另一种方式时,我认为你过于固执己见了......我不知道我还能清楚多少关于这个....如果您对此有任何建议,那么将不胜感激,而不仅仅是违抗我...谢谢... 【参考方案1】:

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

【讨论】:

以上是关于在英特尔 iGPU 上测量内核内的时间的主要内容,如果未能解决你的问题,请参考以下文章

英特尔 SGX:从 enclave 二进制文件复制 enclave 测量值

英特尔 IPP 库要求

英特尔Atom推16内核芯片更新至强单片机

新的英特尔处理器KPTI错误。浮点计算有哪些减速预期? [关闭]

英特尔的Linux Xe内核图形驱动程序

英特尔的Linux Xe内核图形驱动程序