解決策はありますか?
それは可能ですか?
__global *float abc; // pointer to global memory stored in private memory
abc をプライベート メモリではなくローカル メモリに格納する必要があります。
これは、リスト 5.2で明確になっていると思います。
__global int global_data[128]; // 128 integers allocated on global memory
__local float *lf; // pointer placed on the private memory, which points to a single-precision float located on the local memory
__global char * __local lgc[8]; // 8 pointers stored on the local memory that points to a char located on the global memory
ポインタについて私が理解しているように: [ポインタが指している場所] type * [保存する場所] name;
さて、私も以前にあなたと同様の問題に遭遇しました。私が調べたように、それはそのような方法で機能すると思います:OpenCLカーネルでは、アドレス修飾子(__local、__globalなど)のないカーネル内の変数は自動的に考慮されます__private メモリ空間に格納されます。スペース修飾子で宣言されていないポインターについては、__private スペースを指していると見なされます。コード スニペットの例を次に示します。
__kernel void foo(__global uint *ptr)
{
uint tid = get_global_id(0);
uint * localPtr = ptr;
uint var= *(localPtr + tid);
... ...
}
上記のコード スニペットでは、localPtr はメモリ空間修飾子を持たない uint 型のポインタであるため、_プライベート メモリ空間を指すと自動的に見なされます。OpenCL では、アドレス空間 A ( _global など) へのポインターは、同じアドレス空間 (__global) へのポインターにのみ割り当てることができます。したがって、上記の例では、__private アドレス空間へのポインターに、__global アドレスを指すポインター (ptr) を割り当てることはできません。(この点については、「アドレス空間修飾子」セクションの OpenCL 仕様も参照できます)。これが役立つことを願っています!
これは合法です:
global uint *globalPtr=&ptr[tid]