回答編集履歴

4

メモリについて正確な表記に変更

2019/09/23 17:10

投稿

DaichiIshida
DaichiIshida

スコア10

test CHANGED
@@ -48,7 +48,7 @@
48
48
 
49
49
  理論上そうなります。できるだけこの処理リソースを生かす方が処理は早くなります(Occupancyを100%に近くする)
50
50
 
51
- しかし実際にはそうはなりません。というのも,最近のCUDAの実行速度のほとんどがメモリアクセス時間であるため,少し凝った処理をしようとすると,1 blockに対し1024 threadではすぐにレジスタキャッシュを使い切り,グローバルメモリにローカル変数が確保されてしまい,結局遅くなります
51
+ しかし実際にはそうはなりません。というのも,最近のCUDAの実行速度のほとんどがメモリアクセス時間であるため,少し凝った処理をしようとすると,1 blockに対し1024 threadではすぐにレジスタとL1キャッシュを使い切り,オフチップであるL2キャッシュにローカル変数が確保されてしまい,結局遅くなります
52
52
 
53
53
  なので,目安としては1 block に対し, 256 thread か,512 threadと言われています
54
54
 

3

warpSizeについての補足の追加

2019/09/23 17:10

投稿

DaichiIshida
DaichiIshida

スコア10

test CHANGED
@@ -40,6 +40,8 @@
40
40
 
41
41
  やっていることは前半のwarpに奇数の処理を,後半のwarpに偶数の処理を割り当てています。warp間は非同期で進行するので,thread間でのifの待機がなくなり,結果1つ目より早く進行します
42
42
 
43
+ ちなみに,32というマジックナンバーがどうしても気に入らなければ,warpSizeという予約変数がありますので,書き換えてもよいですが,今のところGPUによって変わらないので32で問題なさそうです
44
+
43
45
 
44
46
 
45
47
  ### 2について

2

warpIdxの条件分岐の修正

2019/09/19 13:03

投稿

DaichiIshida
DaichiIshida

スコア10

test CHANGED
@@ -32,7 +32,7 @@
32
32
 
33
33
 
34
34
 
35
- if warpIdx is 1: array[2*laneIdx+1] = 1
35
+ if warpIdx is 0: array[2*laneIdx+1] = 1
36
36
 
37
37
  else: array[2*laneIdx] = 0
38
38
 

1

誤字の修正

2019/09/19 12:54

投稿

DaichiIshida
DaichiIshida

スコア10

test CHANGED
@@ -38,7 +38,7 @@
38
38
 
39
39
  ```
40
40
 
41
- やっていることは前半のwarpに奇数の処理を,後半のwarpに偶数の処理を割り当てています。warpp間は非同期で進行するので,thread間でのifの待機がなくなり,結果1つ目より早く進行します
41
+ やっていることは前半のwarpに奇数の処理を,後半のwarpに偶数の処理を割り当てています。warp間は非同期で進行するので,thread間でのifの待機がなくなり,結果1つ目より早く進行します
42
42
 
43
43
 
44
44