0

私はCUDAを始めたばかりで、CUDAリダクションアルゴリズムに頭を悩ませようとしています。私の場合、2 つの行列のドット積を取得しようとしています。しかし、サイズ 2 の行列についてのみ正しい答えが得られます。他のサイズの行列については、間違っています。

これは単なるテストなので、マトリックスのサイズを非常に小さくしています。約 100 個しかないため、1 ブロックだけですべてが収まります。どんな助けでも大歓迎です。ありがとう!

通常コーデはこちら

float* ha = new float[n]; // matrix a
float* hb = new float[n]; // matrix b
float* hc = new float[1]; // sum of a.b

float dx = hc[0];
float hx = 0;
// dot product
for (int i = 0; i < n; i++)
    hx += ha[i] * hb[i];

ここに私のcudaカーネルがあります

__global__ void sum_reduce(float* da, float* db, float* dc, int n)
 {
     int tid = threadIdx.x;
     dc[tid] = 0;
     for (int stride = 1; stride < n; stride *= 2) {
         if (tid % (2 * stride) == 0)
                 dc[tid] += (da[tid] * db[tid]) + (da[tid+stride] * db[tid+stride]);
         __syncthreads();
     }
 }

私の完全なコード: http://pastebin.com/zS85URX5

4

1 に答える 1