我在OpenCL specification上苦苦掙扎,因爲我發現它有時候很模糊,有人可以試着回答下面的問題嗎?私有內存索引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)是否有緩衝器1和緩衝器之間的差異(靜態或動態)?
2)緩衝區3和緩衝區4的聲明是否相同(它們是針對變量的,但我不確定指針)?
3)在GPU(私有內存只有寄存器,我認爲),編譯器將在哪裏分配資源?如果它在全局內存中,是否有可能知道在主機運行時將使用多少內存?
4)假設buffer3和buffer4存儲在寄存器中,buffer3 [i] = buffer4 [i](我在運行時已知)的指令是可以允許的嗎? 5)如果buffer3和buffer4沒有存儲到寄存器中,那麼如何允許nonKernelFunction代碼(var1和var2絕對不在內存中)?
由於
1)2的最新版本)3)好,謝謝。 4) - 5)不,我想知道編譯器如何生成PTX代碼。讓我回到我的例子:如果var1和var2存儲到寄存器(比如R1和R2),那麼編譯器不能翻譯「* pvar + = 1」這一行,因爲這意味着增加R1或R2所帶的值。並決定哪個寄存器增加不能在編譯時決定。 – GaTTaCa
我編輯了我的答案:EDIT1 ... – Pragmateek