2

解決策はありますか?

それは可能ですか?

__global *float abc; // pointer to global memory stored in private memory

abc をプライベート メモリではなくローカル メモリに格納する必要があります。

4

3 に答える 3

5

これは、リスト 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;

于 2014-03-31T09:06:09.573 に答える
1

さて、私も以前にあなたと同様の問題に遭遇しました。私が調べたように、それはそのような方法で機能すると思います: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 仕様も参照できます)。これが役立つことを願っています!

于 2012-09-19T08:18:01.610 に答える
0

これは合法です:

global uint *globalPtr=&ptr[tid]
于 2013-03-19T07:36:49.493 に答える