1

次のカーネルがあるとします。

__kernel void classify_data_points( __global float* data,
                                    __local float* datasegment)
{
    int gid0 = get_global_id(0);
    int lid = get_local_id(0);
    dataSegment[lid] = data[gid];
}

ご覧のとおり、グローバル メモリからローカル メモリにデータを取り込みたいと考えています。このアクションを一度に実行するために、ローカル メモリのサイズは重要ですか? つまり、dataSegment 配列のサイズは 64 バイトです。次に、この行 'dataSegment[lid] = data[gid]' によって、64 バイトのメモリ空間全体がグローバル メモリから取得したデータで満たされていると仮定できますか? (グローバル メモリには十分なデータがあります) または 512 バイト長のローカル メモリの場合、同じことが言えますか?

4

2 に答える 2

3

あなたの例では、コピーされるメモリの量は、データセグメントのサイズではなく、ワークグループのサイズによって異なります。64 バイトのメモリがコピーされるとは想定できません。

単一のアクションとしてコピーを実行する場合は、async_work_group_copy関数を参照してください。

于 2012-05-14T23:55:58.470 に答える
3

いいえ、ローカル メモリを書き込むコードの後に​​、ローカル メモリ フェンスを備えたバリアが必要です。このようなもの:

barrier(CLK_LOCAL_MEM_FENCE);

そうして初めて、ワークグループのローカル メモリが完全にコピーされたことを確認できます。また、ワークグループのすべてのローカル メモリを初期化するのに十分な作業項目がワークグループにあることを確認する必要があります (この場合は dataSegment です)。

于 2012-05-07T23:57:15.593 に答える