저는 CUDA로 시작하여 CUDA 감소 알고리즘에 대해 두뇌를 감싸하려고합니다. 제 경우에는 두 행렬의 내적을 구하려고 노력했습니다. 하지만 크기가 2 인 행렬에 대해서만 올바른 답을 얻고 있습니다. 다른 크기 행렬에 대해서는 잘못 이해하고 있습니다.2 행렬의 내적에 대한 감소 - 논리 오류가있는 Cuda 커널
이것은 테스트이므로 매트릭스 크기를 매우 작게 유지합니다. 약 100 개 밖에 없으므로 1 블록만으로도 충분합니다. 도움을 주시면 대단히 감사하겠습니다. 감사! 여기
내 CUDA 커널 일반 코드 여기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];
입니다
__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();
}
}
내 전체 코드 :가 N = 2 일 왜 http://pastebin.com/zS85URX5
구문 오류로 인해 코드가 컴파일되지 않을 수 있습니다. 아마 구문 오류가 아닙니다. –
완벽하게 실행되지만 올바른 구문을 사용하지 않을 수도 있습니다. 나의 주된 의문은 아직도 내가 곱하고 추가하고있는 커널에있다. –