CUDAはfloat4配列を配列の構造体に自動的に変換しますか?

Bartvbl

次のコードスニペットがあります。

#include <stdio.h>

struct Nonsense {
    float3 group;
    float other;
};

__global__ void coalesced(float4* float4Array, Nonsense* nonsenseArray) {
    float4 someCoordinate = float4Array[threadIdx.x];
    someCoordinate.x = 5;
    float4Array[threadIdx.x] = someCoordinate;

    Nonsense nonsenseValue = nonsenseArray[threadIdx.x];
    nonsenseValue.other = 3;
    nonsenseArray[threadIdx.x] = nonsenseValue;
}

int main() {
    float4* float4Array;
    cudaMalloc(&float4Array, 32 * sizeof(float4));
    cudaMemset(float4Array, 32 * sizeof(float4), 0);

    Nonsense* nonsenseArray;
    cudaMalloc(&nonsenseArray, 32 * sizeof(Nonsense));
    cudaMemset(nonsenseArray, 32 * sizeof(Nonsense), 0);

    coalesced<<<1, 32>>>(float4Array, nonsenseArray);
    cudaDeviceSynchronize();
    return 0;
}

これをNsightのNvidiaプロファイラーで実行し、グローバルメモリアクセスパターンを見ると、float4Arrayには完全に合体した読み取りと書き込みがあります。一方、ナンセンス配列のアクセスパターンは不十分です(構造体の配列であるため)。

NVCCは、概念的には構造体の配列であるfloat4配列を、メモリアクセスパターンを改善するために配列の構造体に自動的に変換しますか?

ロバート・クロベラ

いいえ、配列の構造体には変換されません。これを注意深く考えれば、コンパイラがこのようにデータを再編成することはほぼ不可能であると結論付けることができると思います。結局のところ、渡されているのはポインタです。

配列は1つだけであり、その配列の要素には、同じ順序で構造体要素があります。

float address (i.e. index):      0      1      2      3      4      5 ...
array element             : a[0].x a[0].y a[0].z a[0].w a[1].x a[1].y ...

ただし、float4コンパイラはスレッドごとに1つの16バイトのロードを生成するため配列の方がパターンが優れていますこれは、float4スレッドごとにベクトル(この場合)をロードするため、「ベクトルロード」と呼ばれることもあります。したがって、隣接するスレッドは引き続き隣接するデータを読み取っており、理想的な合体動作があります。上記の例では、スレッド0が読み出さなりa[0].xa[0].ya[0].zおよびa[0].w、スレッド1が読み取ることになるa[1].xa[1].y等これのすべては、単一で起こるであろう要求(すなわちSASS命令)が、複数に分割することができる取引リクエストを複数のトランザクションに分割しても、効率が低下することはありません(この場合)。

Nonsense構造体の場合、コンパイラはその構造体も同様の方法でロードできることを認識しないため、内部ではスレッドごとに3つまたは4つのロードを生成する必要があります。

  • の最初の2ワードをロードするための1つの8バイトロード(または2つの4バイトロード) float3 group
  • の最後のワードをロードするための1つの4バイトロード float3 group
  • ロードするための1つの4バイトロード float other

おそらく上の図を使用して、スレッドごとに上記の負荷をマップすると、各負荷にストライド(スレッドごとにロードされたアイテム間の未使用の要素)が含まれるため、効率が低下することがわかります。

構造体で注意深い型キャストまたは共用体定義を使用することにより、コンパイラーにNonsense1回のロードで構造体をロードさせることができます。

この回答には、AoS-> SoA変換および関連する効率の向上に関連するいくつかのアイデアも含まれています。

この回答は、ベクトル負荷の詳細をカバーしています。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

pysparkで配列の配列を構造体の配列に変換します

Matlabは構造体を文字列のセル配列に変換します

構造体配列を構造体のセルに、またはその逆に変換します。

Matlabの構造体配列をセル配列に変換します

3 つの個別の辞書配列を 1 つの構造体配列に変換しますか?

Rubyは配列の配列をツリー構造に変換します

構造体の配列を文字列に変換するPyspark

CGOを使用して構造体のGoネスト配列をCに変換しますか?

配列構造の文字列をphpの配列に変換し直します

配列をツリーのような構造に動的に変換します

構造体を使用してJSONを配列に変換する

nlohmannのjsonライブラリは、配列を構造体のベクトルに変換します

nlohmannのjsonライブラリは、配列を構造体のベクトルに変換します

多数の構造体から配列に変数を追加します

構造体の配列を複数の列に変換するにはどうすればよいですか?

「手動で」構築せずに配列と構造体の間で変換できますか?

構造体配列からフィールドを抽出して、別の構造体配列に配置します

char配列を構造体に変換する際の問題。構造体のchar配列変数がオーバーフローします

配列構造を最初の配列から2番目の配列に変換します

PhpStormで短い配列構文を長い(従来の)構文に自動的に変換しますか?

構造体のセル配列をセル配列に変換する方法

構造体の配列をリストレルムに変換する方法は?

構造体の動的配列から要素を削除します

SIMD double-> float変換を使用して、2つのdouble配列を2つのfloatと1つのint(ループ不変)メンバーを持つ構造体の配列に高速インターリーブしますか?

Matlabは構造体配列の要素を変更します

文字列を構造体配列に変換する方法

char配列とint配列の構造体を動的に割り当てます

Numpyは文字列の配列を数値の配列に自動的に変換します

json文字列の列を構造体に変換します

TOP 一覧

  1. 1

    STSでループプロセス「クラスパス通知の送信」のループを停止する方法

  2. 2

    Spring Boot Filter is not getting invoked if remove @component in fitler class

  3. 3

    Python / SciPyのピーク検出アルゴリズム

  4. 4

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  5. 5

    tkinterウィンドウを閉じてもPythonプログラムが終了しない

  6. 6

    androidsoongビルドシステムによるネイティブコードカバレッジ

  7. 7

    ZScalerと証明書の問題により、Dockerを使用できません

  8. 8

    VisualStudioコードの特異点/ドッカー画像でPythonインタープリターを使用するにはどうすればよいですか?

  9. 9

    ビュー用にサイズ変更した後の画像の高さと幅を取得する方法

  10. 10

    二次導関数を数値計算するときの大きな誤差

  11. 11

    Ansibleで複数行のシェルスクリプトを実行する方法

  12. 12

    画像変更コードを実行してもボタンの画像が変更されない

  13. 13

    Reactでclsxを使用する方法

  14. 14

    Three.js indexed BufferGeometry vs. InstancedBufferGeometry

  15. 15

    __init__。pyファイルの整理中に循環インポートエラーが発生しました

  16. 16

    PyTesseractを使用した背景色のため、スクリーンショットからテキストを読み取ることができません

  17. 17

    値間の一致を見つける最も簡単な方法は何ですか

  18. 18

    reCAPTCHA-エラーコード:ユーザーの応答を検証するときの「missing-input-response」、「missing-input-secret」(POSTの詳細がない)

  19. 19

    三項演算子良い練習の代わりとしてOptional.ofNullableを使用していますか?

  20. 20

    好き/愛の関係のためのデータベース設計

  21. 21

    エンティティIDを含む@RequestBody属性をSpringの対応するエンティティに変換します

ホットタグ

アーカイブ