各ワープが同じアドレスの共有メモリにアクセスする場合、32バイトのデータ(ulong4)をどのようにロードしますか?「放送」されますか?アクセス時間は、各スレッドが2バイトの「unsignedshortint」をロードした場合と同じでしょうか?
さて、各ワープで32/64同じバイトの共有メモリからロードする必要がある場合、どうすればこれを行うことができますか?
計算機能 3.0 の前のデバイスでは、共有メモリ アクセスは常に 32 ビット / 4 バイト幅であり、ワープのすべてのスレッドが同じアドレスにアクセスする場合にブロードキャストされます。より広いアクセスは、複数の命令にコンパイルされます。
コンピューティング機能 3.0 では、cudaDeviceSetSharedMemConfig() を使用して、共有メモリ アクセスを 32 ビット幅または 64 ビット幅のいずれかに設定できます。ただし、選択した設定はカーネル全体に適用されます。
[もともと質問の「共有」という小さな単語を見逃していたので、代わりにグローバル メモリについて完全にトピックから外れた回答をしました。それはまだ正しいはずなので、ここに残します:]
場合によります:
コンピューティング機能 1.x デバイスは、転送されたデータの 50% を無駄にします。これは、1 つのスレッドが最大で 16 バイトをロードできるためです。ただし、最小トランザクション サイズは 32 バイトです。さらに、32 バイトのトランザクションは 128 バイトのトランザクションよりもはるかに遅くなります。
最小トランザクション サイズと、トランザクションごとに各スレッドに 8 または 16 バイトを転送するのに十分なデータ パス幅があるため、各スレッドが 8 バイトだけを読み取った場合と同じ時間になります。
データの 2 倍または 4 倍を読み取ると、コンピューティング機能 1.x では 2 倍または 4 倍の時間がかかりますが、2.0 以降では、データが同じキャッシュ ラインに分類される場合に最小限の時間しかかからないため、それ以上のメモリ トランザクションは必要ありません。
そのため、コンピューティング機能 2.0 以降では心配する必要はありません。1.x では、定数キャッシュまたはテクスチャが定数の場合はデータを読み取り、それ以外の場合は共有メモリで並べ替えます (カーネルがメモリ帯域幅にバインドされていると仮定します)。