2012-03-04 4 views
0

私はATI RV770グラフィックスカードを持っていますが、私はOpenCL 1.0-AMD-APP-SDK-v2.5を使ってOpenCLプログラムを実行しています。OpenCLのホストメモリからデバイスメモリにデータがどのように転送されますか?

は、iは、デバイスのメモリ(ビット単位またはバイト単位または> = 32ビットワイズ)にどのようにデータをコピーされている

d_A = clCreateBuffer (context, CL_MEM_READ_ONLY , partition_size * sizeof(datatype),NULL, &err); checkStatus("Failed to create device input buffer A ",err); 
err = clEnqueueWriteBuffer (cmd_queue, d_A, CL_TRUE, 0, partition_size * sizeof(datatype), &h_A, 0, 0 , 0); checkStatus("Failed to copy data from host to device ",err); 

私の質問を使用していますデバイスメモリにホストメモリからデータを転送するには?

iは構造体型のデータを転送することができ、私は、次の構造体型::

typedef struct abc{int a; unsigned char ch[64]; } ABC; 

のH_Aを持っていると私は1000年の要素ABC構造体の種類を転送したいと仮定しますか?はいの場合、データはどのようにデバイスメモリにコピーされますか?

一般に、コンピュータ内のデータの移動には実際にどのような特性が必要ですか?

答えて

1

デバイスメモリに書き込むことのできる内容に制限はありません。 あなたの実装は、最もよく扱えるチャンクを自由にコピーできますが、指示するバイト数だけ書き込むことができます。

構造体については:

あなたのホストコンパイラとのOpenCLコンパイラで使用されるさまざまなパディングの世話をする必要があります。 これを回避する最も簡単な方法は、ホスト構造体で1バイトのアライメントを使用することです(コンパイラの命令をチェックし、GCCでも同じです)。__attribute__ ((packed))をカーネルコードのstructに使用します。また、ホストコードに適切なcl_*タイプを使用して、適切なパディングを確実に行うようにしてください。

ホスト(GCC):

struct __attribute__ ((packed)) ABC 
{ 
    cl_int a; 
    cl_uchar ch[64]; 
}; 

カーネル

struct __attribute__ ((packed)) ABC 
{ 
    int a; 
    unsigned char ch[64]; 
}; 

あなたは何のアライメント(packed属性)がパフォーマンスに影響を与えないことがわかっている場合にも、特定のアラインメント値を使用することができます。アライメントは、ホストとカーネルで同じでなければなりません。

調整された属性の有効性は、 OpenCLデバイスとコンパイラの固有の制限によって制限される場合があることに注意してください。一部の デバイスでは、OpenCLコンパイラは、変数 を特定の最大アライメントまで整列させるようにのみアレンジすることができます。

ただし、特定のハードウェアでのアライメントの効果が既に分かっている場合は、アライメントの制限も知っている可能性があります。

Hereは、属性に関する仕様から少しのテキストです。

+0

OPがAMD SDKに言及して以来、彼らはコンパイラがどのように組合内の整列した構造体のメモリレイアウトを解釈するかに厄介なバグがあります。http://devgurus.amd.com/thread/158559 – eudoxos

関連する問題