估计OpenCL注册使用

ben*_*ope 1 opencl

在查看内核并分配寄存器时,是否有保持编译器满意的经验法则?

编译器具有很大的灵活性,但是我担心如果我在内核中创建了500个变量,或者在很长的单行中进行了大量操作,它可能会开始使用过多的本地内存.

我知道我的程序可以真正检查特定设备上的寄存器使用的唯一方法是使用AMD SDK或NVIDIA SDK(或将汇编代码与Device的架构进行比较).不幸的是,我使用的是PyOpenCL,因此使用这些SDK是不切实际的.

我的程序生成半随机内核,我试图阻止它做一些会阻塞编译器并开始在本地内存中转储寄存器的东西.

Mar*_*o13 7

NVIDIA平台有一个选项,即使在没有SDK的情况下也能以编程方式工作.(也许AMD卡有类似的东西?)

您可以"-cl-nv-verbose"在调用时将其指定为"构建选项" clBuildProgram.这将生成一些日志信息,以后可以通过构建日志获取.

clBuildProgram(program, 0, NULL, "-cl-nv-verbose", NULL, NULL);
clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_LOG, ...);
Run Code Online (Sandbox Code Playgroud)

(对不起,我不确定这个的python语法).

结果应该是包含所需信息的字符串.对于简单的向量添加,这显示

ptxas : info : 0 bytes gmem
ptxas : info : Compiling entry function 'sampleKernel' for 'sm_21'
ptxas : info : Function properties for sampleKernel
    0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas : info : Used 4 registers, 44 bytes cmem[0], 4 bytes cmem[16]
Run Code Online (Sandbox Code Playgroud)

您也可以使用该"-cl-nv-maxrregcount=..."选项指定最大寄存器计数,但当然,所有这些都是特定于设备和平台的,因此应谨慎使用.