如何在 cuRAND 中使用链接器标志?以及 cuRAND 的实现
How to use a linker flag with cuRAND? And implementation of cuRAND
CURAND Library - Compiling Error - Undefined reference to functions
我想我对链接器标志的理解不够充分,因为我不了解如何使用它们。我是否需要将代码放入我正在运行的程序的 makefile 中?有人可以通过写出语法以及我需要把它放在哪里来解释吗?另外,我可以简单地将 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;
}
编辑:我在此处添加 makefile:
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
。
这里发生的事情的简要总结是:
Makefile 的顶部有全大写的变量,如 CUDA_ROOT
和 NVCC
是变量定义。这些变量在下面使用美元符号(例如 $(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.o
被编译,main.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
.
CURAND Library - Compiling Error - Undefined reference to functions
我想我对链接器标志的理解不够充分,因为我不了解如何使用它们。我是否需要将代码放入我正在运行的程序的 makefile 中?有人可以通过写出语法以及我需要把它放在哪里来解释吗?另外,我可以简单地将 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;
}
编辑:我在此处添加 makefile:
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
。
这里发生的事情的简要总结是:
Makefile 的顶部有全大写的变量,如 CUDA_ROOT
和 NVCC
是变量定义。这些变量在下面使用美元符号(例如 $(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.o
被编译,main.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
.