如何将链接器标志与 cuRAND 一起使用?并实施 cuRAND

How to use a linker flag with cuRAND? And implementation of cuRAND

本文关键字:cuRAND 一起 链接 标志      更新时间:2023-10-16

CURAND Library - 编译错误 - 未定义对函数的引用

我想我对链接器标志的理解并不多,因为我不明白如何使用它们。我是否需要将代码放在运行它的程序的生成文件中?有人可以通过写出语法以及我需要把它放在哪里来解释吗?另外,我可以简单地将 CUDA 库中的 curand.lib 文件放在我想使用它的程序文件夹中并从那里引用它吗?

这是我尝试用来为光线追踪程序生成随机数的代码。任何帮助将不胜感激。

float drandGPU()
{
  std::size_t n = 1;
  std::size_t i;
  curandGenerator_t gen;
  float *devData, *hostData;
  hostData = (float*) calloc(n, sizeof(float));
  cudaMalloc((void**) &devData, n*sizeof(float));
  curandCreateGenerator(&gen, CURAND_RNG_PSEUDO_MTGP32);
  curandSetPseudoRandomGeneratorSeed(gen, 1234ULL);
  curandGenerateUniform(gen,devData,n);
  cudaMemcpy(hostData, devData, n*sizeof(float), cudaMemcpyDeviceToHost);
  float f = hostData[0];
  return f;
}

编辑:我在这里添加制作文件:

all: exe
exe: pipe
    g++ -o rayTracer -D__PIKOC_HOST__ -I/usr/local/cuda/include -I../../api/include -I../.. -I. main.cpp -L/usr/local/cuda/lib -lcuda -lGL -lglut
pipe:
    ../../bin/pikoc --numRuns=10 --timer main.cpp
clean:
    rm -f rayTracer __pikoDefines.h __pikoCompiledPipe.h __pikoCompiledPipe.ptx

在 Linux 命令行上,您可以使用 Makefile 轻松构建代码。假设您的文件名为 main.cpp ,下面是一个应该编译代码的 Makefile:

CUDA_ROOT=/usr/local/cuda
NVCC=$(CUDA_ROOT)/bin/nvcc
NVCC_FLAGS=-ccbin g++ -m64
NVCC_ARCH_FLAGS=-gencode arch=compute_20,code=sm_20 -gencode arch=compute_30,code=sm_30
NVCC_IFLAGS=-I$(CUDA_ROOT)/include -I$(CUDA_ROOT)/samples/common/inc
LFLAGS=-lcurand
all: main.exe
main.o: main.cpp
    $(NVCC) $(NVCC_FLAGS) $(NVCC_IFLAGS) $(NVCC_ARCH_FLAGS) -c $< -o $@
main.exe: main.o
    $(NVCC) $(NVCC_FLAGS) $(NVCC_ARCH_FLAGS) $< -o $@ $(LFLAGS)
clean:
    rm -f *.o
clobber: clean
    rm -f main.exe

您需要做的就是将上面的代码片段放在名为 Makefile 的文件中,与您的代码位于同一目录中,然后键入 make

这里发生的事情的简要总结是:

具有全大写变量(如 CUDA_ROOTNVCC)的 Makefile 顶部是变量定义。这些变量在下面使用美元符号(如 $(NVCC))进行编译和链接时使用。

在这里,变量CUDA_ROOT尤其重要,根据您拥有的 Linux/CUDA 安装,它可能会有所不同。我的实际上是/usr/local/cuda-6.5但它也与我在 Makefile 中使用的/usr/local/cuda符号链接。您可能需要更改此变量。如果您有可用的 nvcc 命令,键入 which nvcc 应该会为您提供此路径,并向其添加/bin/nvcc目录。

键入 make 调用第一个目标规则,即 all: main.exe ,并且 main.exe 的规则需要main.o,因此它转到main.o的规则。因此编译目标文件,main.o是第一步。那里没有链接,只是将.cpp文件编译为.o对象文件。然后,一旦编译了main.omain.exe就与它和cuRAND库链接(因此LFLAGS变量包含在main.exe配方中)。

我还更改了您粘贴的代码以获得一些输出:

#include <curand_kernel.h>
#include <helper_cuda.h>
#include <iostream>
float drandGPU()
{
  std::size_t n = 1;
  std::size_t i;
  curandGenerator_t gen;
  float *devData, *hostData;
  hostData = (float*) calloc(n, sizeof(float));
  cudaMalloc((void**) &devData, n*sizeof(float));
  curandCreateGenerator(&gen, CURAND_RNG_PSEUDO_MTGP32);
  curandSetPseudoRandomGeneratorSeed(gen, 1234ULL);
  curandGenerateUniform(gen,devData,n);
  cudaMemcpy(hostData, devData, n*sizeof(float), cudaMemcpyDeviceToHost);
  float f = hostData[0];
  return f;
}

int main()
{
  std::cout << drandGPU() << std::endl;
}

并将其命名为main.cpp.