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

Voo*_*ode -1 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) {
Run Code Online (Sandbox Code Playgroud)

编辑:忘了提到我有一个cuda项目,其文件与库中的文件相同.cuda项目编译正常并且运行正常,所以我认为我的代码中没有大的错误.

Edit2:避免"模板库"的想法.我有一个围绕实际模板类的包装器.所以没有"空"库.

Rob*_*lla 5

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

A.创建库项目:

  1. 选择File ... New ... CUDA C/C++ Project
  2. 选择Static Library ... Empty Project并为项目命名(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现已构建)

test8lib.h:

#ifndef TEST8LIB_H_
#define TEST8LIB_H_

void calc_square_vec_float(float *in_data, float *out_data, int size);


#endif /* TEST8LIB_H_ */
Run Code Online (Sandbox Code Playgroud)

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_ */
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

B.创建主项目:

  1. 文件...新... C++项目...空项目... Linux GCC工具链,给它一个名字(test9)
  2. 下一步...完成以完成项目的创建
  3. 文件...新源文件...默认C++源模板,给它一个名字(test9.cpp)
  4. 使用下面的内容编辑文件,保存.
  5. 添加include路径:Project ... Properties ... Build ... Settings ... Tool Settings ... GCC C++ Compiler ... Includes ... Include Paths ...添加并添加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. 运行项目

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;
}
Run Code Online (Sandbox Code Playgroud)