Включить статическую библиотеку 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 ответ

Вот набор инструкций, которые должны помочь:

А. Создать библиотечный проект:

  1. выберите Файл... Новый... Проект CUDA C/C++
  2. Выберите Статическая библиотека... Пустой проект и присвойте проекту имя (test8)
  3. Далее... Далее... Готово, чтобы закончить создание проекта
  4. щелкните правой кнопкой мыши на имени проекта в окне Project Explorer, выберите New...Header File, присвойте ему имя (test8lib.h)
  5. отредактируйте test8lib.h (с содержанием снизу), сохраните его
  6. создайте еще один новый заголовочный файл для шаблона cuda (test8.cuh)
  7. отредактируйте test8.cuh (с содержанием снизу), сохраните его
  8. создать новый исходный файл, (test8.cu)
  9. отредактируйте test8.cu (с содержанием снизу), сохраните его
  10. выберите проект... построить проект (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);
}

Б. Создайте основной проект:

  1. Файл... новый...C++ проект... пустой проект...Linux GCC toolchain, дайте ему имя (test9)
  2. Далее... Готово, чтобы закончить создание проекта
  3. Файл... Новый исходный файл... Исходный шаблон C++ по умолчанию, дайте ему имя (test9.cpp)
  4. отредактируйте файл с содержимым снизу, сохраните его.
  5. добавить путь включения: Проект... Свойства... Сборка... Настройки... Настройки инструмента... Компилятор GCC C++... Включает... Включить пути... Добавить и добавить каталог, где test8lib.h расположен.
  6. добавьте lib: Настройки инструмента...GCC C++ Linker... Библиотеки... Библиотеки... Добавить и добавить имя ранее созданной библиотеки (test8)
  7. также добавить библиотеку времени выполнения CUDA (cudart)
  8. добавить путь к lib: Настройки инструмента...GCC C++ Linker... Библиотеки... Пути к библиотекам... Добавить и добавить путь к ранее созданной библиотеке (например, /path/to/cuda-workspace/test8/Debug)
  9. также добавьте путь к cudart (например, /usr/local/cuda/lib64)
  10. Построить проект
  11. Запустить проект

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;
}
Другие вопросы по тегам