これは、NVIDIA ComputeVisualProfilerからの私のカーネルの占有分析のコピーです。
Kernel details : Grid size: 300 x 1, Block size: 224 x 1 x 1
Register Ratio = 0.75 ( 24576 / 32768 ) [48 registers per thread]
Shared Memory Ratio = 0 ( 0 / 49152 ) [0 bytes per Block]
Active Blocks per SM = 2 : 8
Active threads per SM = 448 : 1536
Occupancy = 0.291667 ( 14 / 48 )
Achieved occupancy = 0.291667 (on 14 SMs)
Occupancy limiting factor = Registers
Warning: Grid Size (300) is not a multiple of available SMs (14).
私はopenCLを初めて使用し、SMで3つの同時ブロックを起動できるように、使用するレジスターの数を減らすために多くの最適化を行いました。ただし、プロファイラーは、2つのブロックのみを同時に実行できることを示しているだけであり、制限係数はレジスターです。しかし、問題は、私のカーネルがブロックごとに224 x 48 = 10752レジスタしか使用しないため、3ブロックを実行できることは明らかです(つまり、224 x 48 x 3 =32256レジスタ/32768使用可能なレジスタ)。ブロックあたりのスレッド数を208に減らしても問題は解決しません。つまり、3ブロックで208 x 48 x 3=29952/32768のみを使用する必要があります。
最初はローカルメモリのせいだと思いますが、ローカルメモリの計算では3ブロック/SMを起動できるはずです。また、カーネルがローカルメモリを使用しているのに、プロファイラーに共有メモリ比率が表示されない理由がわかりません。
ご協力いただきありがとうございます。