Включить статическую библиотеку cuda в проект C++
У меня есть шаблонная статическая библиотека CUDA, которую я хочу включить в общий проект C++. Когда я включаю заголовки библиотеки, компилятор падает и говорит, что не может разрешить символы, специфичные для CUDA. Конечно, компилятор g ++ не может интерпретировать эти символы. Я знаю проблему, но я не знаю, как решить эту проблему с помощью IDE nsight.
Я использую nsight для библиотеки cuda/nvcc и проекта C++ / g ++.
Консольный вывод:
make all
Building file: ../src/MedPrak.cpp
Invoking: GCC C++ Compiler
g++ -I/home/voodoocode/Praktikum/MedPrak/PrivateRepo/MedPrakCuda/src -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/MedPrak.d" -MT"src/MedPrak.d" -o "src/MedPrak.o" "../src/MedPrak.cpp"
In file included from ../src/cudaWrapper.cu:8:0,
from ../src/MedPrak.cpp:3:
/home/voodoocode/Praktikum/MedPrak/PrivateRepo/MedPrakCuda/src/kernel.h:15:23: error: ‘__global__’ does not name a type
template <typename T> __global__ void squareVector(T *input, T *output, int size) {
Изменить: Забыл упомянуть, что у меня есть проект CUDA с теми же файлами, что и в библиотеке. Проект cuda прекрасно компилируется и работает правильно, поэтому я думаю, что в моем коде нет большой ошибки.
Edit2: чтобы избежать идеи "библиотеки шаблонов". У меня есть обертка вокруг фактических классов шаблона. Так что нет "пустой" библиотеки.
1 ответ
Вот набор инструкций, которые должны помочь:
А. Создать библиотечный проект:
- выберите Файл... Новый... Проект CUDA C/C++
- Выберите Статическая библиотека... Пустой проект и присвойте проекту имя (test8)
- Далее... Далее... Готово, чтобы закончить создание проекта
- щелкните правой кнопкой мыши на имени проекта в окне Project Explorer, выберите New...Header File, присвойте ему имя (test8lib.h)
- отредактируйте test8lib.h (с содержанием снизу), сохраните его
- создайте еще один новый заголовочный файл для шаблона cuda (test8.cuh)
- отредактируйте test8.cuh (с содержанием снизу), сохраните его
- создать новый исходный файл, (test8.cu)
- отредактируйте test8.cu (с содержанием снизу), сохраните его
- выберите проект... построить проект (libtest8.a уже собран)
test8lib.h:
#ifndef TEST8LIB_H_
#define TEST8LIB_H_
void calc_square_vec_float(float *in_data, float *out_data, int size);
#endif /* TEST8LIB_H_ */
test8.cuh:
#ifndef TEST8_CUH_
#define TEST8_CUH_
template <typename T> __global__ void squareVector(T *input, T *output, int size) {
int idx = threadIdx.x+blockDim.x*blockIdx.x;
if (idx < size) output[idx]=input[idx]*input[idx];
}
#endif /* TEST8_CUH_ */
test8.cu:
#include "test8lib.h"
#include "test8.cuh"
#define nTPB 256
void calc_square_vec_float(float *in_data, float *out_data, int size){
float *d_in_data, *d_out_data;
cudaMalloc(&d_in_data, size*sizeof(float));
cudaMalloc(&d_out_data, size*sizeof(float));
cudaMemcpy(d_in_data, in_data, size*sizeof(float),cudaMemcpyHostToDevice);
squareVector<<<(size+nTPB-1)/nTPB, nTPB>>>(d_in_data, d_out_data, size);
cudaMemcpy(out_data, d_out_data, size*sizeof(float),cudaMemcpyDeviceToHost);
}
Б. Создайте основной проект:
- Файл... новый...C++ проект... пустой проект...Linux GCC toolchain, дайте ему имя (test9)
- Далее... Готово, чтобы закончить создание проекта
- Файл... Новый исходный файл... Исходный шаблон C++ по умолчанию, дайте ему имя (test9.cpp)
- отредактируйте файл с содержимым снизу, сохраните его.
- добавить путь включения: Проект... Свойства... Сборка... Настройки... Настройки инструмента... Компилятор GCC C++... Включает... Включить пути... Добавить и добавить каталог, где test8lib.h расположен.
- добавьте lib: Настройки инструмента...GCC C++ Linker... Библиотеки... Библиотеки... Добавить и добавить имя ранее созданной библиотеки (test8)
- также добавить библиотеку времени выполнения CUDA (cudart)
- добавить путь к lib: Настройки инструмента...GCC C++ Linker... Библиотеки... Пути к библиотекам... Добавить и добавить путь к ранее созданной библиотеке (например,
/path/to/cuda-workspace/test8/Debug
) - также добавьте путь к cudart (например,
/usr/local/cuda/lib64
) - Построить проект
- Запустить проект
test9.cpp:
#include <stdio.h>
#include <stdlib.h>
#include "test8lib.h"
#define DSIZE 4
#define TEST_VAL 2.0f
int main(){
float *in, *out;
in = (float *)malloc(DSIZE*sizeof(float));
out = (float *)malloc(DSIZE*sizeof(float));
for (int i=0; i<DSIZE; i++){
in[i] = TEST_VAL;
out[i] = 0.0f;
}
calc_square_vec_float(in, out, DSIZE);
for (int i=0; i<DSIZE; i++)
if (out[i] != (float)(TEST_VAL*TEST_VAL)){
printf("mismatch at %d, was: %f, should be: %f\n", i, out[i], (float)(TEST_VAL*TEST_VAL));
return 1;
}
printf("Success!\n");
return 0;
}