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

时间:2014-07-04 13:40:29

标签: c++ cuda g++ nvcc nsight

我有一个模板化的静态CUDA库,我希望将其包含在一个常见的c ++项目中。当我包含库的头文件时,编译器崩溃并说它无法解析特定于CUDA的符号。当然g ++编译器无法解释这些符号。我知道这个问题,但我不知道如何使用nsight IDE解决这个问题。

我正在使用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 个答案:

答案 0 :(得分:5)

以下是一组应该有用的说明:

  

一个。创建库项目:

  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. 选择Project ... Build Project(libtest8.a现已建成)
  11. 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:工具设置... GCC C ++链接器...库...库...添加并添加以前构建的库的名称(test8)
    7. 还添加了CUDA运行时库(cudart)
    8. 添加lib路径:工具设置... GCC C ++链接器...库...库路径...添加并添加以前构建的库的路径(例如/path/to/cuda-workspace/test8/Debug
    9. 还会添加cudart的路径(例如/usr/local/cuda/lib64
    10. 构建项目
    11. 运行项目
    12. 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;
      }