4

次のようなカーネル ソースがいくつかあることに気付きました (グーグルでランダムに見つけました)。

__kernel void fill(__global float* array, unsigned int arrayLength, float val)
{
    if(get_global_id(0) < arrayLength)
    {
        array[get_global_id(0)] = val;
    }
}

私の質問は、if ステートメントが実際に必要かどうかです (この例の「arrayLength」がグローバル作業サイズと同じであると仮定します)。

私が見たより「専門的な」カーネルのいくつかには、存在しません。また、ハードウェアがカーネルを無意味な座標に割り当てないようにすることもうまくいくように思えます。

ただし、プロセッサがグループで動作することも知っています。したがって、グループの一部のプロセッサは何もしない必要があると想像できます (たとえば、サイズが 16 のグループが 1 つあり、作業サイズが 41 の場合、グループは最初の 16 個の作業項目を処理し、次に次の 16 個を処理し、次に次の 9 つは、7 つのプロセッサが何もしない状態で、ダミーのカーネルを取得しますか?)。

スペックを確認しました。、および「get_global_id」の唯一の関連する言及は、次のオンライン ドキュメントと同じです。

    The global work-item ID specifies the work-item ID based on the number of global work-items specified to execute the kernel.

. . . どのように基づいていますか?

それで、それは何ですか?配列のサイズが作業グループのサイズの倍数である場合、省略しても安全ですか? 何?

ありがとう、
イアン

4

1 に答える 1

3

あなたはすでに正しい答えを持っていると思います。カーネル実行のグローバル サイズが配列の長さと同じである場合、このifステートメントは役に立ちません。

一般に、そのタイプのチェックは、配列サイズに関連して余分な作業項目を実行する可能性があることがわかっている方法でデータを分割した場合にのみ必要です。私の経験では、ほとんどの場合、そのようなケースを回避できます。

于 2012-06-15T20:19:24.907 に答える