2

カーネル内ですべて同じ長さの double の複数の配列を使用しようとしています。各 double* を個別の引数として渡す代わりに、複数の double を保持する .cl ファイルで構造体を定義し、代わりに構造体の配列に対する 1 つのポインターをカーネルに渡すことができることを知っています。

2 つの方法でパフォーマンスは異なりますか? 私が間違っている場合は修正してください。ただし、個々のダブル ポインターを渡すことは、アクセスを結合できることを意味すると思います。構造へのアクセスも合体しますか?

4

3 に答える 3

0

構造にポインターが含まれていない限り、あなたの言うことは絶対に可能です。一般に、主な影響は、既に検討したように、これがメモリ操作の合体に及ぼす影響です。影響の大きさは、メモリ アクセス パターン、構造体のサイズ、実行しているデバイスによって異なります。これをより完全に説明するには、さらに詳細が必要です。

そうは言っても、この方法で構造体を使用して非常にうまくいった例の 1 つは、読み取られる要素がワーク グループ内のすべてのワーク アイテムで同じである場合です。この場合、ハードウェア (nvidia GTX 570) にペナルティはありません。また、場合によっては、シリアル化されるメモリ操作によって追加されたレイテンシが隠される可能性があることも覚えておく価値があります。CUDA の世界では、これは演算強度の高い問題に対して高い占有率を持つことによって達成されます。

最後に、構造体を使用することによるセマンティックの明快さは、それ自体でメリットがあることを指摘しておく価値があります。これは、特定の問題のパフォーマンス コストに対して考慮する必要があります。私のアドバイスは、試してみることです。これらの問題の影響を事前に予測することは非常に困難です。

于 2013-08-02T09:00:03.950 に答える
0

理論上は同じ性能です。ただし、一部のメンバーにより頻繁にアクセスする場合は、CPU キャッシュの局所性により、複数の segregatedvarray を使用するとパフォーマンスが大幅に向上します。ただし、複数のアレイがある場合、ほとんどの操作はより困難になります。

于 2015-09-05T16:49:09.290 に答える
-1

構造と単一要素のパフォーマンスはまったく同じです。double の大きな配列があり、最初の作業項目が 0、100、200、300、... を使用し、次の作業項目が 1、101、201、301、... を使用するとします。

100 個の double の構造がある場合、メモリ内で最初の構造が最初 (0-99)、次に 2 番目 (100-199) などになります。カーネルはまったく同じメモリにアクセスし、同じ場所にアクセスします。唯一の違いは、メモリの抽象化を定義する方法です。

異なる要素タイプ (char、int、double、bool など) の構造を持つより一般的なケースでは、アラインメントが単一のデータ配列であるかのようにならない場合があります。しかし、それはまだ「半合体」です。パフォーマンスは今でも同じだと思います。

于 2013-08-02T12:08:23.503 に答える