2012-11-20 44 views
2

我在OpenCL specification上苦苦掙扎,因爲我發現它有時候很模糊,有人可以試着回答下面的問題嗎?私有內存索引Op​​enCL

考慮下面的代碼:

__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)是否有緩衝器1和緩衝器之間的差異(靜態或動態)?

2)緩衝區3和緩衝區4的聲明是否相同(它們是針對變量的,但我不確定指針)?

3)在GPU(私有內存只有寄存器,我認爲),編譯器將在哪裏分配資源?如果它在全局內存中,是否有可能知道在主機運行時將使用多少內存?

4)假設buffer3和buffer4存儲在寄存器中,buffer3 [i] = buffer4 [i](我在運行時已知)的指令是可以允許的嗎? 5)如果buffer3和buffer4沒有存儲到寄存器中,那麼如何允許nonKernelFunction代碼(var1和var2絕對不在內存中)?

由於

回答

1

AFAIK:

1)有在內核代碼靜態規格和通過經由緩衝器主機「動態」規範之間沒有差別的技術;

2)默認變量是__private,所以這不應該有任何區別; 3)私人存儲器可以在寄存器中分配,如果很小,但其他全局存儲器將被使用; 您可以使用clGetKernelWorkGroupInfo查詢內核的最低內存要求;

4)他們爲什麼不應該被允許,因爲它可能會導致出界錯誤? 5)var1和var2位於GPU的地址空間中,即使不在私有內存中也是如此。訪問可能會比較慢。

EDIT1: 即VAR1和VAR2在寄存器中,說REG1 1和REG,不應該是一個問題,因爲代碼會導致僞彙編喜歡這樣的事實:

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上,則不存在問題,因爲您使用堆棧抽象出有效位置。

注意,這裏存在規範:) http://www.khronos.org/registry/cl/specs/opencl-1.2.pdf

+0

1)2的最新版本)3)好,謝謝。 4) - 5)不,我想知道編譯器如何生成PTX代碼。讓我回到我的例子:如果var1和var2存儲到寄存器(比如R1和R2),那麼編譯器不能翻譯「* pvar + = 1」這一行,因爲這意味着增加R1或R2所帶的值。並決定哪個寄存器增加不能在編譯時決定。 – GaTTaCa

+0

我編輯了我的答案:EDIT1 ... – Pragmateek