CUDA+GPGPU、C++、C#などのプログラムについての備忘録がわり
Posted by サンマヤ - 2008.07.15,Tue
CUDAにおけるKernel実行を最適化する際に重要な要素の一つに、
SharedMemoryを有効に使うということがあります。
これは、いくつかのサンプルでも最適化方針としてあげられていることですが、
いまいち、どういう場合にバンク衝突が起こるか分かりませんでした。
SharedMemoryはいくつかのバンクに分けられており、
同時に複数のスレッドが同じバンクにアクセスしようとすると、遅延が生じます。
これを回避するためのアドレッシングをどのように行ったらよいのか、ということなのですが、
日本語のプログラミングガイドでははっきり言って、意味が分かりませんw
ということで、英語版やらサンプルを見ながら分かったことを書いておきます。
・現状では、バンク数はワープ数の半分の16
これは、実際の実行がワープ単位ではなく半ワープ単位で行われているため。
今後のチップ能力の向上によっては、この数値は32になる可能性が高い。
・1バンクは32ビット(4バイト)の連続したメモリを含んでいる。
・バンクの番号は周期的に割り振られている。
たとえば、
char ___shared___ sdata[];
と定義してある場合、sdata[0],sdata[1],sdata[2],sdata[3]がバンク0に属するわけですが、
16×4=64バイト先のメモリである、
sdata[64],sdata[65],sdata[66],sdata[67]もバンク0に属する、らしい。。。
これについては、近日中に検証プログラムを書いて報告する予定です。
SharedMemoryを有効に使うということがあります。
これは、いくつかのサンプルでも最適化方針としてあげられていることですが、
いまいち、どういう場合にバンク衝突が起こるか分かりませんでした。
SharedMemoryはいくつかのバンクに分けられており、
同時に複数のスレッドが同じバンクにアクセスしようとすると、遅延が生じます。
これを回避するためのアドレッシングをどのように行ったらよいのか、ということなのですが、
日本語のプログラミングガイドでははっきり言って、意味が分かりませんw
ということで、英語版やらサンプルを見ながら分かったことを書いておきます。
・現状では、バンク数はワープ数の半分の16
これは、実際の実行がワープ単位ではなく半ワープ単位で行われているため。
今後のチップ能力の向上によっては、この数値は32になる可能性が高い。
・1バンクは32ビット(4バイト)の連続したメモリを含んでいる。
・バンクの番号は周期的に割り振られている。
たとえば、
char ___shared___ sdata[];
と定義してある場合、sdata[0],sdata[1],sdata[2],sdata[3]がバンク0に属するわけですが、
16×4=64バイト先のメモリである、
sdata[64],sdata[65],sdata[66],sdata[67]もバンク0に属する、らしい。。。
これについては、近日中に検証プログラムを書いて報告する予定です。
PR
Posted by サンマヤ - 2008.07.15,Tue
ブログを開設してみました。
本体は私のサイトですが、まとまった記事を書いていくのが大変なので、
ブログに少しずつ書いていき、まとまったら、サイトを更新するという形で
やっていきたいと思います。
まあ、本業の横で、実験的にやってることなので、更新は遅いと思いますが^^;
本体は私のサイトですが、まとまった記事を書いていくのが大変なので、
ブログに少しずつ書いていき、まとまったら、サイトを更新するという形で
やっていきたいと思います。
まあ、本業の横で、実験的にやってることなので、更新は遅いと思いますが^^;
<<
前のページ
カレンダー
リンク
カテゴリー
フリーエリア
最新コメント
[11/19 矢野 忠]
[02/25 山本義和]
[07/08 hirota]
[07/06 hirota]
[02/05 矢野 忠]
最新記事
(04/04)
(01/11)
(05/17)
(06/07)
(09/09)
最新トラックバック
プロフィール
ブログ内検索
最古記事
(07/15)
(07/15)
(07/16)
(07/16)
(07/16)
カウンター
忍者アナライズ
Template by mavericyard*
Powered by "Samurai Factory"
Powered by "Samurai Factory"