Система застревает при выполнении умножения матриц с использованием CUDA - PullRequest
0 голосов
/ 07 октября 2018

Когда я запускаю этот код в моей системе, через несколько секунд моя система зависает, и я должен перезапустить систему снова.Итак, мой вопрос: что я здесь делаю не так?Любое предложение будет оценено.

__global__ void matMul(float* d_M, float* d_N, float* d_P, int width) {
int row = blockIdx.y*width + threadIdx.y;
int col = blockIdx.x*width + threadIdx.x;

if (row < width && col < width) {
    float product_val = 0;
        for (int k = 0; k < width; k++) {
            product_val += d_M[row*width + k] * d_N[k*width + col];
        }
    d_P[row*width + col] = product_val;
 }
}


int main() {
const int n = 9;
float* d_M;
float* d_N;
float* d_P;

cudaMallocManaged(&d_M, SIZE * sizeof(float));
cudaMallocManaged(&d_N, SIZE * sizeof(float));
cudaMallocManaged(&d_P, SIZE * sizeof(float));

for (int i = 0; i < n; ++i) {
    d_P[i] = 0;
}

int count = 0;
for (int i = 0; i < n; ++i) {
    d_N[i] = ++count;
}

count = 0;
for (int i = 0; i < n; ++i) {
    d_M[i] = ++count;
}

matMul <<<1, n>>> (d_M, d_N, d_P, 3);
cudaDeviceSynchronize();

for (int i = 0; i < n; ++i) {
    printf("%f\n", d_P[i]);
}
cudaFree(d_N);
cudaFree(d_M);
cudaFree(d_P);
return 0;

}

1 Ответ

0 голосов
/ 07 октября 2018

Предполагая, что когда вы имеете в виду, что ваша система зависает, вы получаете какую-то ошибку в вашей программе, скорее всего, вы обращаетесь к недопустимой памяти.

Это может быть в более высоких индексах ваших итераций d_M и d_N, когда k + row * width индексируется сверх размера памяти, выделенного вами в cudaMallocManaged.

Это всегда хорошая практикав подобных ситуациях добавить некоторую обработку ошибок, используя такие команды, как cudaPeekatLastError ().

Эта ссылка может быть полезна для реализации некоторой отладки.

...