我正在努力解决 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没有存入寄存器,那么,如何允许nonKernelFunction代码(var1和var2肯定不在内存中)?
谢谢