我试图找出如何使用CUDA内核作为库的一部分,以便我可以将库添加到我现有的C ++源文件中,并且能够使用cuda内核。
那你怎么做呢?我尝试创建一个包装器,如下所示:
.h文件:
#ifndef __reductions2d_H_
#define __reductions2d_H_
#include <stdio.h>
#include <cuda.h>
#include <cuda_runtime.h>
extern "C" void getMean_wrapper();
#endif
.CU
__global__ void getMean(float *devDataPtr, size_t pitch, int rows, int cols)
{
for (int r = 0; r < height; ++r)
{
float* row = (float*)((char*)devPtr + r * pitch);
for (int c = 0; c < width; ++c)
{
printf("Row[%i][%i]: %4.3f \n",r,c row[c]);
}
}
}
void getMean_wrapper()
{
// Host code
int width = 3, height = 3;
int N = width*height;
float* devData; size_t pitch;
cudaMallocPitch(&devData, &pitch, width * sizeof(float),height);
int blockSize = 4;
int nBlocks = N/blockSize + (N%blockSize == 0?0:1);
getMean<<<nBlocks, blockSize>>>(devData, pitch, width,height);
}
的main.cpp
#include "reductions2d.h"
int main(void){
getMean_wrapper();
return 0;
}
然而,当我用nvcc * .cpp编译它时,它告诉我它找不到getMean_wrapper(),当我尝试用g ++ -c main.cpp编译时,它告诉我它找不到cuda.h和cuda_runtime.h
使用我的G ++命令行指定cuda库的位置,构建这些对象,构建.cu对象,然后链接它们是最好的方法吗?看起来像是一个麻烦,必须有一个3步骤的过程来添加一些cuda功能
由于
编辑:
似乎当我尝试单独进行时,与
链接g++ -o runme *.o -lcuda
我得到了
$ g++ -o runme *.o -lcuda
reductions2d.o: In function `__sti____cudaRegisterAll_47_tmpxft_00007643_00000000_4_reductions2d_cpp1_ii_4ef 611a7()':
tmpxft_00007643_00000000-1_reductions2d.cudafe1.cpp:(.text+0x15e): undefined reference to `__cudaRegisterFatBinary'
tmpxft_00007643_00000000-1_reductions2d.cudafe1.cpp:(.text+0x1b9): undefined reference to `__cudaRegisterFunction'
reductions2d.o: In function `__cudaUnregisterBinaryUtil()':
tmpxft_00007643_00000000-1_reductions2d.cudafe1.cpp:(.text+0x1d8): undefined reference to `__cudaUnregisterFatBinary'
reductions2d.o: In function `__device_stub__Z7getMeanPfmii(float*, unsigned long, int, int)':
tmpxft_00007643_00000000-1_reductions2d.cudafe1.cpp:(.text+0x20d): undefined reference to `cudaSetupArgument'
tmpxft_00007643_00000000-1_reductions2d.cudafe1.cpp:(.text+0x22f): undefined reference to `cudaSetupArgument'
tmpxft_00007643_00000000-1_reductions2d.cudafe1.cpp:(.text+0x251): undefined reference to `cudaSetupArgument'
tmpxft_00007643_00000000-1_reductions2d.cudafe1.cpp:(.text+0x273): undefined reference to `cudaSetupArgument'
reductions2d.o: In function `getMean_wrapper':
tmpxft_00007643_00000000-1_reductions2d.cudafe1.cpp:(.text+0x164c): undefined reference to `cudaConfigureCall'
reductions2d.o: In function `cudaError cudaLaunch<char>(char*)':
tmpxft_00007643_00000000-1_reductions2d.cudafe1.cpp:(.text._Z10cudaLaunchIcE9cudaErrorPT_[cudaError cudaLaunch<char>(char*)]+0x11): undefined reference to `cudaLaunch'
reductions2d.o: In function `cudaError cudaMallocPitch<float>(float**, unsigned long*, unsigned long, unsigned long)':
tmpxft_00007643_00000000-1_reductions2d.cudafe1.cpp:(.text._Z15cudaMallocPitchIfE9cudaErrorPPT_Pmmm[cudaError cudaMallocPitch<float>(float**, unsigned long*, unsigned long, unsigned long)]+0x29): undefined reference to `cudaMallocPitch'
我读到我需要包含cuda运行时库,所以我做了
ldconfig -p | grep cudart并在我的LD_LIBRARY_PATH中包含了/ usr / local / cuda / lib64,它仍然无法找到cudart
答案 0 :(得分:5)
也将.h
加入.cu
。 nvcc是c ++编译器和mangles名称。
编译为:
nvcc -c file.cu // compile cuda kernel
nvcc file.o main.cpp // compile and link
我会将您的代码更改为:
.HPP
#ifndef __reductions2d_H_
#define __reductions2d_H_
void getMean_wrapper(); // c++ linkga
#endif
.CU:
#include "...hpp"
#include <cuda.h>
#include <cuda_runtime.h>
__global__ void getMean(float *devDataPtr, size_t pitch, int rows, int cols)
{
然后编译为
nvcc -c file.cu // compile cuda kernel
g++ -lcudart file.o main.cpp // no cuda stuff needed save for lib