0

今日は、グローバル メモリ バッファがどのように割り当てられ、OpenCL に保存されるかをテストしたいと思いますが、結果に戸惑いました。グローバル メモリ バッファーを作成し、それをカーネルに渡しました。このカーネルは CPU デバイスと GPU デバイスの両方に組み込まれていますが、このバッファーの前半を CPU に、残りの半分を GPU に割り当てます。 CPU と GPU の開始点となるため、CPU と GPU は同じバッファーで同時に作業できますが、場所は異なります。次に、カーネルで &buffer[offset+tid] を使用して buffer の各要素のアドレスを取得し、そのアドレスをそれ自体に再度格納します。

__kernel void foo(__global uint * buffer, const uint offset)
{
    uint tid = get_global_id(0);
    buffer[offset+tid] = &buffer[offset+tid];
}

バッファを CPU に送り返して値を出力した後、CPU カーネルから返されたアドレス値は連続しており、GPU から返された値も連続していることがわかりましたが、これら 2 つのアドレス空間は互いに連続していません。CPU と GPU は同じバッファで動作していると思いますが、バッファの後半のアドレスが前半と連続していないのはなぜですか? デバイス (CPU または GPU) を 1 つしか使用しない場合、すべてのアドレスは正しく連続しています。この問題を解決するのを手伝ってくれる人はいますか? GPU メモリの基本的な概念の誤解かもしれないので、詳細な解釈が必要です。

PS.:このように理解できますか: 物理的にはバッファが 1 つしかありませんが、グローバル メモリは実際には不透明な構造ですが、グローバル メモリと CPU 間のアドレス変換とマッピングにより、異なるデバイスから返されるアドレス値は異なります。 、グローバルメモリとCPUは実装ランダムで独立していますか?

4

1 に答える 1

0

質問の最後の「PS」は正しい軌道に乗っています。

OpenCL デバイスのポインター値は、デバイス実装で定義され、特定のデバイスでの単一のカーネル呼び出しの存続期間中のみ意味があります。実装がカーネル呼び出しからカーネル呼び出しまで同じバッファーに異なるベースアドレスを使用することは合法です (ただし、実装は実際にはこれを行わない場合があります)。

そのため、グローバル メモリ ポインターをグローバル メモリに書き込む場合、そのポインター値がカーネルの最後を超えて有効であると期待するべきではありません。

于 2012-09-19T16:02:14.813 に答える