Самое большое препятствие, с которым вы, скорее всего, столкнетесь - это то, как вызвать ваше ядро из вашего файла 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
}