Я только начал изучать cuda, но буквально только что прочитал это из книги. Похоже, это относится непосредственно к вам.
"Вы можете передавать указатели, выделенные с помощью cudaMalloc (), для функций, которые выполняются на устройстве. (Kernals, верно?)
Вы можете использовать указатели, выделенные с помощью cudaMalloc (), для чтения или записи памяти из кода, который выполняется на устройстве. (Снова Kernals)
Вы можете передавать указатели, выделенные с помощью cudaMalloc, функциям, которые выполняются на хосте. (обычный код C)
Вы НЕ МОЖЕТЕ использовать указатели, выделенные с помощью cudaMalloc (), для чтения или записи памяти из кода, который выполняется на хосте. "
- ^^ из «Cuda by Example» Джейсона Сандерса и Эдварда Кандрота, опубликованной Addison-Wesley yadda yadda здесь нет плагиата.
Поскольку вы разыменовываете внутри ядра, возможно, верно и противоположное последнему правилу. то есть вы не можете использовать указатели, выделенные хостом, для чтения или записи памяти из кода, который выполняется на устройстве.
Редактировать: я также только что заметил функцию с именем cudaMemcpy
Похоже, вам нужно было бы дважды объявить массив 3000 int в коде хоста. Один вызвал malloc, другой вызвав cudaMalloc. Передайте cuda one в ядро, а также входной массив для сортировки. Затем после вызова функции ядра:
cudaMemcpy(malloced_array, cudaMallocedArray, 3000*sizeof(int), cudaMemcpyDeviceToHost)
Я буквально только начал изучать это, как сказал, так что, возможно, есть лучшее решение.