私有内存索引OpenCL

私有内存索引OpenCL,opencl,Opencl,我正在与OpenCL斗争,因为我发现它有时模棱两可,有人能试着回答以下问题吗 考虑以下代码: __kernel void myKernel(...) { // Buffer 1 __local float *buffer1[64]; // Buffer 2 __local float *buffer2; // Buffer 3 __private float *buffer3[64]; // Buffer 4 floa

我正在与OpenCL斗争,因为我发现它有时模棱两可,有人能试着回答以下问题吗

考虑以下代码:

__kernel void myKernel(...)
{    
    // Buffer 1
    __local float *buffer1[64];

    // Buffer 2
    __local float *buffer2;

    // Buffer 3
    __private float *buffer3[64];

    // Buffer 4
    float *buffer4[64];

    int var1 = 1, var2 = 2;
    nonKernelFunction(&var1, &var2);

    // ...

}

void nonKernelFunction(int *pvar1, int *pvar2)
{
    int *pvar;
    if (someRunTimeCondition)
        pvar = pvar1;
    else
        pvar = pvar2;
    *pvar += 1; 
}
1) buffer1和buffer2之间是否存在差异(静态或动态)

2) buffer3和buffer4的声明是否等效(它们用于变量,但我不确定是否用于指针)

3) 在GPU上(我认为私有内存只是寄存器),编译器将在哪里分配资源?如果它位于全局内存中,是否可以从主机知道在运行时将使用多少内存

4) 假设buffer3和buffer4存储在寄存器中,如何允许像buffer3[i]=buffer4[i](在运行时已知i)这样的指令

5) 如果buffer3和buffer4没有存储到寄存器中,那么如何允许非内核函数代码(var1和var2肯定不在内存中)

谢谢各位:

1) 内核代码中的静态规范与主机通过缓冲区进行的“动态”规范之间没有技术区别

2) 默认情况下,变量是私有的,因此这不会造成任何差异

3) 如果要使用较小的全局内存,则可以在寄存器中分配专用内存; 您可以使用clGetKernelWorkGroupInfo查询内核的最低内存需求

4) 为什么不允许它们,因为这可能会导致越界错误

5) var1和var2位于GPU的地址空间中,即使不在专用内存中;访问速度可能较慢,仅此而已

编辑1: var1和var2位于寄存器(例如reg1和reg2)中这一事实不应成为问题,因为代码可能导致伪汇编,如:

myKernel:
    ...
    push reg1
    push reg2
    call nonKernelFunction
    ...

nonKernelFunction:
    test someRunTimeCondition
    jz ko
        mov [SP+2] reg1
        jmp end:
    ko:
        mov [SP+1] reg1
    end:
    mov [reg1] reg2
    inc reg2
    mov reg2 [reg1]
我不知道GPU组件/核心架构是否有很大不同,但在标准CPU上没有问题,因为您使用堆栈对有效位置进行抽象

请注意,这里有一个更新版本的规范:)

1)2)3)好的,谢谢。4) -5)不,我想知道编译器如何生成PTX代码。让我回到我的例子:如果var1和var2存储在寄存器中(比如R1和R2),那么编译器无法转换行“*pvar+=1”,因为这意味着增加R1或R2携带的值。而决定增加哪个寄存器不能在编译时决定。