1

デバイス側で構造体を定義しています。GPU と CPU で同じサイズになりますか?

ホスト側:

typedef struct {
    cl_float4* ptr;
} my_struct_cpu;

デバイス側:

typedef struct {
    float4* ptr;
} my_struct_gpu;
4

4 に答える 4

1
typedef struct {
    cl_float4* ptr;
} my_struct_cpu;

この場合、ホスト ポインターは sizeof(int*) == sizeof(cl_float4*) になり、アプリケーションが 32 ビットまたは 64 ビットでコンパイルされているかどうかに応じて、4 または 8 バイトにマップされます。モバイル以外のデバイスを使用している場合は 64 ビットである可能性が高く、スマートフォンでは 32 ビットまたは 64 ビットである可能性がありますが、これは変更されています.

typedef struct {
    float4* ptr;
} my_struct_gpu;

sizeof(int*) == sizeof(float4*) デバイス上で、これも 32 ビットまたは 64 ビットにすることができますが、OpenCL 1.x の場合、ホスト ポインターとデバイス ポインターが同じサイズである必要はなく、実際にはGPU が 32 ビット ポインターになることは非常に一般的です。h OpenCL 2.x の場合、これは当てはまらない場合があります。特に、OpenCL 2.0 では拡張機能として CPU と GPU の間に共有仮想メモリが導入されました。これが特定の OpenCL プラットフォームでサポートされている場合、ホスト ポインターとデバイス ポインターは実際には同じサイズになります。さらに、フル ファイン グレイン SVM がサポートされている場合、これは追加の拡張機能であり、ホスト ポインタを直接デバイスに渡すことができます (たとえば、他のデータ構造内)。

于 2015-03-27T21:31:10.853 に答える
0

ホスト側:

  typedef struct {
     cl_float4* ptr;
  } my_struct_cpu;

  float * SerializeForPcieSend(my_struct_cpu [] p){...}

GPUに送信:

 array_of_floats_widthx4 -----> enqueuewritebuffer

GPU 側: cl 側の構造体を受け取り、構築します:

 __kernel void BuildStructs(__global float * structArr, __global my_struct_gpu * structs_in_gpu)
  {
         .... copies, computes, builds

  }

次に、gpu はこの新しいデータを計算します

   __kernel void BuildStructs(__global my_struct_gpu * structs_in_gpu, __global float * responseArray)
  {
         .... computes, extracts elements and puts in response array

  }

ホスト側: CPU が結果を受け取ります

  clenqueuereadbuffer
  array_of_floats_widthx4 <------------- response array

sizeof(cl_float)*num_elements でバッファーの読み取りと書き込みのサイズを再確認することを忘れないでください。

次に、ホスト側オブジェクトを再構築します

    my_struct_cpu * DeserializeAfterPcieDownload(float * p){...}

簡単な答え: いいえ、常にではありません。しかし、より大きな要素を構造体の上側に配置し、エンディアンが同じであれば、一部の gpu では問題にならないはずです。float3 タイプがある場合は、それらを直接送信しないでください。

于 2015-03-27T20:31:42.590 に答える
0

どのように使用するか例を挙げていただけますか?

このような構造は、ある cl_mem へのポインターを別の cl_mem に渡すことができないため、基本的に両側で使用するのは意味がありません。

于 2015-03-27T14:58:12.560 に答える