Проблема разыменования CUDA Pointer - PullRequest
2 голосов
/ 19 августа 2010

Я занимаюсь разработкой программы с использованием cuda sdk и 9600 1 GB NVidia Card. В эта программа

0) Ядро передает указатель двумерного массива int размером 3000x6 во входных аргументах.

1) Кенел должен отсортировать его по 3 уровням (1-й, 2-й и 3-й столбцы).

2) Для этого ядро ​​объявляет массив указателей типа int размером 3000.

3) Затем ядро ​​заполняет массив указателей указателями, указывающими на расположение входного массива в отсортированном порядке.

4) Наконец, ядро ​​копирует входной массив в выходной массив путем разыменования массива указателей.

Этот последний шаг завершается неудачей и останавливает ПК.

В1) Каковы правила разыменования указателей в cuda для извлечения содержимого памяти?

, даже самый маленький массив 20x2 не работает правильно. тот же код работает вне памяти устройства cuda (т.е. в стандартной программе на C)

Q2) Разве это не должно работать так же, как мы делаем в стандартном C, используя оператор '*', или для этого нужно использовать некоторые cudaapi .?

Ответы [ 2 ]

1 голос
/ 20 августа 2010

Код CUDA может использовать указатели точно так же, как код хоста (например, разыменование с помощью * или [], обычная арифметика указателей и т. Д.).Однако важно учитывать, что доступ к местоположению (т. Е. Местоположение, на которое указывает указатель) должен быть виден для графического процессора.

Если вы выделяете память хоста, например, с помощью malloc () или std :: vectorто эта память не будет видна графическому процессору, это память хоста, а не память устройства.Чтобы выделить память устройства, вы должны использовать cudaMalloc () - указатели на память, выделенную с помощью cudaMalloc (), могут быть свободно доступны с устройства, но не с хоста.

Чтобы скопировать данные между ними, используйте cudaMemcpy ().

Когда вы становитесь более продвинутыми, линии могут быть немного размыты, используя «отображенную память», можно разрешить графическому процессору доступ к частям памяти хоста, но это должно быть обработано особым образом, см. CUDA.Руководство по программированию для получения дополнительной информации.

Я настоятельно рекомендую вам взглянуть на примеры CUDA SDK, чтобы увидеть, как все это работает.Начните с примера vectorAdd, возможно, и с любого, относящегося к вашей области знаний.Матричное умножение и транспонирование, вероятно, также легко усваиваются.

Вся документация, инструментарий и примеры кода (SDK) доступны на веб-сайте разработчика CUDA .

1 голос
/ 20 августа 2010

Я только начал изучать 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)

Я буквально только начал изучать это, как сказал, так что, возможно, есть лучшее решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...