【问题标题】:Estimate OpenCL Register Use估计 OpenCL 寄存器的使用
【发布时间】:2014-07-11 13:39:43
【问题描述】:

当编译器查看内核并分配寄存器时,是否有一个经验法则可以让编译器满意?

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

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

我的程序生成半随机内核,我试图阻止它执行会阻塞编译器并开始将寄存器转储到本地内存中的事情。

【问题讨论】:

    标签: opencl


    【解决方案1】:

    对于 NVIDIA 平台,有一个选项甚至可以在没有 SDK 的情况下以编程方式工作。 (也许 AMD 卡也有类似的东西?)

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

    clBuildProgram(program, 0, NULL, "-cl-nv-verbose", NULL, NULL);
    clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_LOG, ...);
    

    (对不起,我不确定这方面的 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]
    

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

    【讨论】:

      【解决方案2】:

      编译器将跟踪私有变量范围,重要的不是您声明的变量数量,而是它们的使用方式。

      例如,在以下示例中,仅使用了 2 个寄存器。虽然使用了 5 个私有变量:

      //Notice here, that a value is used in the register when it has to be stored
      // not when it is declared. So declaring a variable that is never used will be
      // optimized and removed by the compiler.
      
      R1 | R2 |  Code
       a |  - |  int a = 1;
       a |  b |  int b = 3;
       a |  b |  int c;
       c |  b |  c = a + b;
       c |  b |  int d;
       c |  d |  d = c + b;
       c |  d |  int e;
       e |  - |  int e = c + d;
       - |  - |  out[idx] = e; //Global memory output
      

      这完全取决于变量的范围(何时需要、是否需要以及需要​​多长时间)。


      如果编译器无法预测内存,唯一的关键是不要创建超出需要的内存。

       int a[100];
       //Initialize a with some value
       int b;
       b = a[global_index];
      

      编译器将无法预测您正在使用的值,因此它需要 100 个值,并且会在需要时溢出内存。对于这类操作,最好创建一个表,甚至对全局表进行一次读取。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-30
        • 2012-08-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多