回答編集履歴
4
メモリについて正確な表記に変更
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についての補足の追加
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の条件分岐の修正
test
CHANGED
@@ -32,7 +32,7 @@
|
|
32
32
|
|
33
33
|
|
34
34
|
|
35
|
-
if warpIdx is
|
35
|
+
if warpIdx is 0: array[2*laneIdx+1] = 1
|
36
36
|
|
37
37
|
else: array[2*laneIdx] = 0
|
38
38
|
|
1
誤字の修正
test
CHANGED
@@ -38,7 +38,7 @@
|
|
38
38
|
|
39
39
|
```
|
40
40
|
|
41
|
-
やっていることは前半のwarpに奇数の処理を,後半のwarpに偶数の処理を割り当てています。warp
|
41
|
+
やっていることは前半のwarpに奇数の処理を,後半のwarpに偶数の処理を割り当てています。warp間は非同期で進行するので,thread間でのifの待機がなくなり,結果1つ目より早く進行します
|
42
42
|
|
43
43
|
|
44
44
|
|