私は CUDA コードを書いており、GForce 9500 GT グラフィック カードを使用しています。
20000000 整数要素の配列を処理しようとしていますが、使用しているスレッド番号は 256 です
ワープ サイズは 32 です。計算能力は 1.1 です。
これはハードウェアですhttp://www.geforce.com/hardware/desktop-gpus/geforce-9500-gt/specifications
今、ブロック番号 = 20000000/256 = 78125 ?
この音は正しくありません。ブロック数の計算方法を教えてください。どんな助けでも大歓迎です。
私のCUDAカーネル関数は次のとおりです。アイデアは、各ブロックがその合計を計算し、次に各ブロックの合計を加算することによって最終的な合計が計算されるというものです。
__global__ static void calculateSum(int * num, int * result, int DATA_SIZE)
{
extern __shared__ int shared[];
const int tid = threadIdx.x;
const int bid = blockIdx.x;
shared[tid] = 0;
for (int i = bid * THREAD_NUM + tid; i < DATA_SIZE; i += BLOCK_NUM * THREAD_NUM) {
shared[tid] += num[i];
}
__syncthreads();
int offset = THREAD_NUM / 2;
while (offset > 0) {
if (tid < offset) {
shared[tid] += shared[tid + offset];
}
offset >>= 1;
__syncthreads();
}
if (tid == 0) {
result[bid] = shared[0];
}
}
そして、私はこの関数を
calculateSum <<<BLOCK_NUM, THREAD_NUM, THREAD_NUM * sizeof(int)>>> (gpuarray, result, size);
THREAD_NUM = 256 で、GPU 配列のサイズは 20000000 です。
ここでは、ブロック番号を 16 として使用していますが、それが正しいかどうかはわかりません。最大の並列処理が達成されるようにするにはどうすればよいですか?
これが私の CUDA Occupancy Calculator の出力です。ブロック番号が 8 の場合、占有率は 100% になります。つまり、ブロック番号が 8 でスレッド番号が 256 の場合に最大の効率が得られるということです。あれは正しいですか?
ありがとう