私は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