Инкремент и доступ к глобальному счетчику CUDA - PullRequest
0 голосов
/ 22 октября 2018

Мне нужно, чтобы мое ядро ​​связывалось с хостом.Я пытался использовать глобальный счетчик (лучшие способы хорошо приняты), но следующий код печатает всегда 0. Что я делаю не так?(Я пробовал как комментарии, так и комментарии).

#include <stdio.h>
#include <cuda_runtime.h>

//__device__ int count[1] = {0};
__device__ int count = 0;

__global__ void inc() {
    //count[0]++;
    atomicAdd(&count, 1);
}

int main(void) {
    inc<<<1,10>>>();
    cudaDeviceSynchronize();
    //int *c;
    int c;
    cudaMemcpyFromSymbol(&c, count, sizeof(int), cudaMemcpyDeviceToHost);
    printf("%d\n", c);
    return 0;
}

1 Ответ

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

Каждый раз, когда у вас возникают проблемы с кодом CUDA, я настоятельно рекомендую вам использовать правильную проверку ошибок CUDA и запускать код с cuda-memcheck, до , обращаясь к другим за помощью.Даже если вы не понимаете вывод ошибки, предоставление ее в вашем вопросе будет полезно для тех, кто пытается вам помочь.

Если бы вы сделали это, вы бы получили сообщение, которое выдает cudaMemcpyFromSymbolошибка неверного аргумента.

Если вы изучите документацию для этого вызова функции, вы увидите, что 4-й параметр не является параметром направления, а является параметром смещения.Таким образом, предоставление cudaMemcpyDeviceToHost неверно для параметра смещения.Поскольку cudaMemcpyFromSymbol всегда является передачей устройства -> хоста, предоставление аргумента направления является избыточным, и, поскольку он предоставляется по умолчанию, в этом нет необходимости.Ваш код работает правильно для меня, просто исключив:

$ cat t1414.cu
#include <stdio.h>
#include <cuda_runtime.h>

//__device__ int count[1] = {0};
__device__ int count = 0;

__global__ void inc() {
    //count[0]++;
    atomicAdd(&count, 1);
}

int main(void) {
    inc<<<1,10>>>();
    cudaDeviceSynchronize();
    //int *c;
    int c;
    cudaMemcpyFromSymbol(&c, count, sizeof(int));
    printf("%d\n", c);
    return 0;
}
$ nvcc -o t1414 t1414.cu
$ cuda-memcheck ./t1414
========= CUDA-MEMCHECK
10
========= ERROR SUMMARY: 0 errors
$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...