현재 코드는 범위를 벗어난 메모리 액세스를 확인하지 않습니다. 내가 cuda memcheck를 실행할 때 메모리 액세스가 2 x 2의 행렬조차도 나쁘다 고합니다! 나는 어쨌든해서는 안되는 메모리에 액세스하고 있는데, 이것이 문제입니다!
는 경계 메모리 액세스 중 확인 ./(insert CUDA-memcheck를 실행하려면 아래 표시됨이 행렬 곱셈 자체 내 코드입니다) 여기에 실행 :
dim3 block(32,32);
dim3 grid((n+31)/32, (n+31)/32);
matrixMul<<<grid,block>>>(d_C, d_A, d_B, n, k);
kA 미만 및 kB는 값이있는 행렬입니다 (두 가지 모두 더 쉽게 만들 수 있습니다).
m, N, K는 KC 답변을 저장하는 행렬 내 정사각형 행렬
모든 동일한 수있다. 당신이 스레드의 그리드를 정의하는 방법에 따라
는#ifndef _MATRIXMUL_KERNEL_H_
#define _MATRIXMUL_KERNEL_H_
#include <stdio.h>
__global__ void matrixMul(float *kC, float *kA, float *kB, int n, int k)
{
int tx = blockIdx.x * 32 + threadIdx.x;
int ty = blockIdx.y * 32 + threadIdx.y;
float value = 0;
for (int i=0;i<n;i++)
{
float elementA=kA[ty*n+i];
float elementB=kB[i*k+tx];
value += elementA*elementB;
}
kC[ty*n+tx] = value;
}
#endif // #ifndef _MATRIXMUL_KERNEL_H_
메모리가 부족합니까? – Mechy
변수'value'의 정의는 어디에 있습니까? for 루프 앞에 0을 초기화합니까? 이 코드는 컴파일하는 것처럼 보이지 않습니다. –
@Robert Crovella 내 코드를 옮길 때 잘못된 변수 이름을 썼다. 그것은 "float 값"이어야하며 "float 값"이어야합니다. 내 프로그램에 "float value"가 있습니다. 10x10까지 작동한다면 그것이 내 기억일지도 모른다라고 생각하니? 10x10의 값은 행렬의 일부 행에 대한 값 또는 때로는 다른 값을 반환합니다 ... – Mechy