43

私は最近OpenCLで遊んでいて、グローバルメモリのみを使用する単純なカーネルを書くことができます。ここでローカルメモリの使用を開始したいのですが、一度に1つの「チャンク」の出力を使用get_local_size()および計算する方法がわからないようです。get_local_id()

たとえば、AppleのOpenCLHelloWorldサンプルカーネルをローカルメモリを使用するものに変換したいとします。どうしますか?元のカーネルソースは次のとおりです。

__kernel square(
    __global float *input,
    __global float *output,
    const unsigned int count)
{
    int i = get_global_id(0);
    if (i < count)
        output[i] = input[i] * input[i];
}

この例をローカルメモリの使用方法を示すものに簡単に変換できない場合は、他の簡単な例で十分です。

4

3 に答える 3

32

NVIDIA または AMD SDK のサンプルを確認してください。正しい方向を示しているはずです。たとえば、行列の転置はローカル メモリを使用します。

二乗カーネルを使用すると、データを中間バッファーにステージングできます。追加のパラメーターを渡すことを忘れないでください。

__kernel square(
    __global float *input,
    __global float *output,
    __local float *temp,
    const unsigned int count)
{
    int gtid = get_global_id(0);
    int ltid = get_local_id(0);
    if (gtid < count)
    {
        temp[ltid] = input[gtid];
        // if the threads were reading data from other threads, then we would
        // want a barrier here to ensure the write completes before the read
        output[gtid] =  temp[ltid] * temp[ltid];
    }
}
于 2010-04-02T10:20:09.103 に答える
30

ローカルメモリのサイズが一定の場合、これを行う別の可能性があります。カーネル パラメーター リストでポインターを使用せずに、__local と宣言するだけでローカル バッファーをカーネル内で宣言できます。

__local float localBuffer[1024];

これにより、clSetKernelArg 呼び出しが少なくなるため、コードが削除されます。

于 2011-06-13T17:23:51.850 に答える