今日は、グローバル メモリ バッファがどのように割り当てられ、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は実装ランダムで独立していますか?