Я думаю, что массив может быть выделен на gpu ex. __device__ int device_array[100];
без использования cudaMalloc, поскольку длина известна. Но когда я запускаю следующий код, отображаются некоторые нерелевантные числа. Я изучил популярную книгу для cuda, и все примеры там используют cudaMalloc. Можно использовать массив фиксированного размера, например, или он должен быть выделен cudaMalloc?cuda фиксированный размер глобальный массив
__device__ int device_array[100];
__global__ void kernel() {
device_array[blockIdx.x] = blockIdx.x;
}
void call_kernel(int *host_array) {
kernel<<<100,1>>>();
cudaMemcpy(host_array, device_array, 100 * sizeof(int), cudaMemcpyDeviceToHost);
}
int main() {
int host_array[100];
call_kernel(host_array);
for (int i = 0; i < 100; i++)
cout << host_array[i] << endl;
}
В вашем коде отсутствует проверка ошибок. Вероятно, что вызов 'cudaMemcpy' терпит неудачу, но вы просто этого не знаете, потому что вы не проверяете статус возврата. Как только вы подтвердите, что ошибка возникает во время выполнения, источник проблемы станет очевидным. – talonmies
Подробнее [clues] (http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#device-variable-qualifier). Как сделать проверку ошибок хорошо обсуждается [здесь] (http://stackoverflow.com/questions/14038589/what-is-the-canonical-way-to-check-for-errors-using-the-cuda-runtime- апи). –