проблема CUDA и C ++ - PullRequest
       35

проблема CUDA и C ++

0 голосов
/ 16 марта 2011

привет, у меня есть программа CUDA, которая успешно работает, вот код для программы CUDAи другой .cu файл для ядра.Я просто хочу сделать это для обучения, и я не хочу писать один и тот же код ядра снова и снова.Кто-нибудь может сказать мне, как это сделать?как разделить этот код на два разных файла?чем как его скомпилировать?как написать makefile для него?как

Ответы [ 2 ]

1 голос
/ 16 марта 2011

Код с расширениями CUDA C должен быть в файле * .cu, остальные могут быть в файле c ++.

Таким образом, здесь код вашего ядра можно переместить в отдельный файл * .cu.

Чтобы иметь реализацию основной функции в файле c ++, вам нужно заключить вызов ядра (код с square_array<<<...>>>(...);)c ++ функция, реализация которой также должна быть в * cu файле.

Функции cudaMalloc и т. Д. Можно оставить в файле c ++, если вы включите правильные заголовки cuda. ​​

0 голосов
/ 16 марта 2011

Самое большое препятствие, с которым вы, скорее всего, столкнетесь - это то, как вызвать ваше ядро ​​из вашего файла cpp. C ++ не будет понимать ваш синтаксис <<< >>>. Есть 3 способа сделать это.

  • Просто напишите небольшую инкапсулирующую функцию хоста в вашем .cu файле

  • Использование функций библиотеки CUDA (cudaConfigureCall, cudaFuncGetAttributes, cudaLaunch) --- подробности см. В Справочном руководстве Cuda, глава «Контроль выполнения» онлайн-версия . Вы можете использовать эти функции в простом коде C ++, если вы включаете библиотеки cuda. ​​

  • Включить PTX во время выполнения. Это сложнее, но позволяет вам манипулировать кодом PTX во время выполнения. Этот подход JIT объясняется в Руководстве по программированию Cuda (глава 3.3.2) и в Справочном руководстве Cuda (глава «Управление модулями») онлайн-версия


Инкапсилирующая функция может выглядеть следующим образом:

mystuff.cu:

... //your device square_array function

void host_square_array(dim3 grid, dim3 block, float *deviceA, int N) {
  square_array <<< grid, block >>> (deviceA, N);
}

mystuff.h

#include <cuda.h>
void host_square_array(dim3 grid, dim3 block, float *deviceA, int N);

mymain.cpp

#include "mystuff.h"

int main() { ... //your normal host code
}
...