Написание ядра CUDA для замены эквивалентной функции только для процессора - PullRequest
1 голос
/ 22 ноября 2011

У меня есть несколько .cpp файлов, которые реализуют гидродинамику Smoothed Particle, которая является методом частиц для моделирования потока жидкости.

Одним из наиболее трудоемких компонентов в этих методах частиц является поиск ближайших соседей (K-ближайших соседей или поиск по дальности) для каждой частицы на каждом временном шаге моделирования.

Сейчас я просто хочу ускорить процедуру поиска соседей, используя графические процессоры и CUDA, заменив мою текущую процедуру поиска соседей на основе процессора.Только поиск соседей будет выполняться на графических процессорах, в то время как остальная часть симуляции продолжается на процессоре.

Мой вопрос: как мне скомпилировать весь код?Если быть более точным, предположим, что я записываю функцию ядра поиска соседей в файл nsearch.cu.

Затем я должен переименовать все мои предыдущие файлы .cpp в .cu файлы и повторно-компилировать весь набор (вместе с nsearch.cu), используя nvcc?Для простых примеров, по крайней мере, nvcc не может компилировать коды CUDA с расширением .cpp, то есть nvcc foo.cu компилируется, но nvcc hello.cpp нет.

Короче говоря, какой должна быть структура этого плагина CUDA и как мне его собирать?

Я использую Ubuntu Linux 10.10, CUDA 4.0, NVIDIA GTX 570 (Computeability 2.0) и компилятор gcc для моей работы

Ответы [ 2 ]

2 голосов
/ 22 ноября 2011

Вам нужно написать файл nsearch.cu и скомпилировать его с помощью «nvcc -c -o nsearch.o», а затем связать nsearch.o с основным приложением.Должен быть файл nsearch.h, который экспортирует оболочку вокруг реального ядра.

in nsearch.h : 
void kern();

in nsearch.cu:
void __global__ kern__() {
}
void kern() {
  kern__<<<...>>>();
}
0 голосов
/ 05 декабря 2011

Это более широкий ответ на ваш вопрос, поскольку я прошел через очень похожий для вас мыслительный процесс - перенес мой гидродинамический код на графический процессор, оставив все остальное на процессоре.Хотя я думаю, что это то, с чего вам следует начать, я также думаю, что вы должны начать планировать перенести весь свой другой код на GPU.Я обнаружил, что, хотя графический процессор очень хорошо справлялся с разложением матрицы, необходимым для моего моделирования, граница памяти между графическим процессором и памятью процессора была настолько медленной, что около 80-90% времени моделирования графического процессора проводилось в cudaMemcpyDeviceToHost /cudaMemcpyHostToDevice.

...