在c++项目中包含一个静态cuda库

Include a static cuda library into a c++ project

本文关键字:静态 cuda 包含一 c++ 项目      更新时间:2023-10-16

我有一个模板化的静态CUDA库,我想把它包含到一个通用的c++项目中。当我包含库的头文件时,编译器崩溃并说它无法解析cuda特定的符号。当然,c++编译器不能解释这些符号。我知道这个问题,但我不知道如何使用insight IDE来解决这个问题。

我在cuda/nvcc库和c++/g++项目中都使用了insight。

控制台输出

:

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++项目
  2. 选择静态库…空Project并给项目命名(test8)
  3. 明年……完成创建项目
  4. 右键单击项目资源管理器窗口中的项目名称,选择新建…头文件,给它一个名字(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);
}

B。创建主项目:

  1. 文件…新的c++项目…空项目……Linux GCC工具链,给它一个名字(test9)
  2. 下一个……完成创建项目
  3. 文件…新的源文件…默认的c++源模板,给它一个名字(test9.cpp)
  4. 用下面的内容编辑文件,保存
  5. 添加包含路径:项目属性…构建设置…工具设置…GCC c++编译器包括…包括路径…添加和添加目录test8lib.h所在位置
  6. 添加lib: Tool Settings…c++链接器…库…库…添加和添加先前构建的库的名称(test8)
  7. 还添加CUDA运行库(cudart)
  8. 添加lib路径:Tool Settings…GCC c++链接器…库路径…添加和添加先前构建的库的路径(例如/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: %fn", i, out[i], (float)(TEST_VAL*TEST_VAL));
            return 1;
        }
    printf("Success!n");
    return 0;
}