我有一个模板化的静态CUDA库,我想将其包含在一个普通的c项目中.当我包含库的标头时,编译器崩溃并说“它无法解析特定于CUDA的符号”.当然,g编译器无法解释这些符号.我知道这个问题,但是我不知道如何使用nsight IDE解决此问题.
我在cuda / nvcc库和c / g项目中都使用了nsight.
控制台输出:
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. Create library project:
>选择文件…新建… CUDA C/C++项目
>选择静态库…空项目,并为项目命名(test8)
>下一步…下一步…完成以完成项目的创建
>在Project Explorer窗口中右键单击项目名称,选择New … Header File,为其命名(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_ */
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. Create main project:
> File … new … C project … empty project … Linux GCC工具链,为其命名(test9)
>下一步…完成创建项目
> File … New Source File … Default C source template,给它起一个名字(test9.cpp)
>使用以下内容编辑文件,然后保存.
>添加包含路径:
项目…属性…生成…设置…工具设置… GCC C
编译器…包含…包含路径…添加并添加目录
test8lib.h所在的位置.
>添加库:工具设置… GCC C链接器…库…库…添加并添加以前构建的库的名称(test8)
>还添加CUDA运行时库(cudart)
>添加库路径:工具设置… GCC C链接器…库…库路径…添加该路径并将其添加到先前构建的库中(例如/ path / to / cuda-workspace / test8 / Debug )
>也将路径添加到cudart(例如/usr/local/cuda / lib64)
>建设项目
>运行项目
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;
}