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

将静态CUDA库包含到C++项目中 我有一个模板化的静态CUDA库,我想把它包含到一个普通的C++项目中。当我包含库的头时,编译器崩溃并说它无法解析CUDA特定的符号。当然,g++编译器无法解释这些符号。我知道这个问题,但是我不知道如何使用nsight IDE解决这个问题,c++,cuda,g++,nvcc,nsight,C++,Cuda,G++,Nvcc,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/

我将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:避免模板库的想法。我在实际的模板类周围有一个包装器。因此,没有空的库。

以下是一组说明,应该会有所帮助:

A.创建库项目:

选择文件…新建…CUDA C/C++项目 选择staticlibrary…emptyproject并为该项目命名为test8 下一步…下一步…完成以完成创建项目 在ProjectExplorer窗口中右键单击项目名称,选择新建…头文件,给它命名为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_ */

你到底犯了什么错误?你的编译设置是什么?发布问题中传递给g++的确切错误消息和编译器设置。对于我的代码中的不同行多次出现相同的错误。看起来你实际上没有链接到库。如果库不是仅标头,那么您将遇到一些问题__global_uu是一个CUDA扩展关键字,您是否使用不同的命令行参数和不同的头来编译另一个项目?我怀疑至少您必须在这里使用compile标志-lcuda。另一个项目,cuda one,是使用识别这些命令的nvcc编译器编译的。您的库不应该在其接口头文件中公开任何与cuda相关的内容。使用nvcc编译CUDA库,然后像使用gcc一样将其与其他c/c++代码链接。
#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);
}
#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;
}