在c++项目中包含一个静态cuda库
Include a static cuda library into a c++ project
我有一个模板化的静态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:为了避免"模板库"的想法。我对实际的模板类进行了包装。所以没有"空"的库
下面是一组应该会有所帮助的指令:
。创建库项目:
- 新
- 选择文件……CUDA C/c++项目
- 选择静态库…空Project并给项目命名(test8)
- 明年……完成创建项目
- 右键单击项目资源管理器窗口中的项目名称,选择新建…头文件,给它一个名字(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。创建主项目:
- 文件…新的c++项目…空项目……Linux GCC工具链,给它一个名字(test9)
- 下一个……完成创建项目
- 文件…新的源文件…默认的c++源模板,给它一个名字(test9.cpp)
- 用下面的内容编辑文件,保存
- 添加包含路径:项目属性…构建设置…工具设置…GCC c++编译器包括…包括路径…添加和添加目录test8lib.h所在位置
- 添加lib: Tool Settings…c++链接器…库…库…添加和添加先前构建的库的名称(test8)
- 还添加CUDA运行库(cudart)
- 添加lib路径:Tool Settings…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: %fn", i, out[i], (float)(TEST_VAL*TEST_VAL));
return 1;
}
printf("Success!n");
return 0;
}
相关文章:
- 编译时未启用intel oneApi CUDA支持
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- #为""定义宏;静态";针对不同的上下文
- cmake如何在fedora工作站中找到boost静态库包
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 将公共但非静态的成员函数与ALGLIB集成
- cmake在我的项目中所需的所有静态库都不成功
- cmake cuda在Windows上单独的编译静态LIB链接错误,但在Ubuntu上没有
- 设备代码中的CUDA类静态成员的成语
- 如何在CUDA中使用静态常量成员
- 结构中的 CUDA 设备功能指针,没有静态指针或符号副本
- 在cuda中使用静态成员函数模板结构的另一种方法
- CUDA cudaMalloc在运行带有巨大静态数组的内核后失败
- CUDA:是将 M[][] 用于 2D 静态数组还是将它们展平为 M[] 更好
- 创建要与C++程序链接的静态 CUDA 库
- CUDA:为什么不能定义静态全局成员函数
- 从静态初始化代码启动CUDA内核时遇到问题
- 在c++项目中包含一个静态cuda库
- 如何将类的非静态成员函数传递给CUDA内核函数(__global__函数)
- 模板化代码的CUDA中的静态常量int