使用nvcc(CUDA-RINSIDE)正确链接对象文件
Linking properly object files with nvcc (CUDA-RINSIDE)
我正在尝试使Rinside
与一些CUDA代码一起工作。我第一次尝试用NVCC直接编译它们,但不可能用NVCC处理Rinside,所以现在我正在尝试另一种方法。
我用g++
编译Rinside代码并获得对象文件(.o)
,然后用nvcc编译一些CUDA代码并获得另一个.o
,然后将它们链接在一起,但我得到了一些"非引用错误"。
这是RINSIDE代码:
#include <RInside.h> // for the embedded R via RInside
extern "C"
void someCUDAcode();
int main(int argc, char *argv[]) {
RInside R(argc, argv); // create an embedded R instance
someCUDAcode();
exit(0);
}
这是CUDA代码:
#include <cuda.h>
#include <cuda_runtime.h>
#include <R.h>
__global__ void mykernel(int a){
int id = threadIdx.x;
int b = a;
b++;
id++;
}
extern "C"
void someCUDAcode() {
mykernel<<<1, 1>>>(1);
}
这是我的makefile:
## and set R_HOME accordingly as an environment variable
R_HOME := $(shell R RHOME)
sources := $(wildcard *.cpp)
programs := $(sources:.cpp=)
## include headers and libraries for R
RCPPFLAGS := $(shell $(R_HOME)/bin/R CMD config --cppflags)
RLDFLAGS := $(shell $(R_HOME)/bin/R CMD config --ldflags)
RBLAS := $(shell $(R_HOME)/bin/R CMD config BLAS_LIBS)
RLAPACK := $(shell $(R_HOME)/bin/R CMD config LAPACK_LIBS)
## if you need to set an rpath to R itself, also uncomment
#RRPATH := -Wl,-rpath,$(R_HOME)/lib
## include headers and libraries for Rcpp interface classes
## note that RCPPLIBS will be empty with Rcpp (>= 0.11.0) and can be omitted
RCPPINCL := $(shell echo 'Rcpp:::CxxFlags()' | $(R_HOME)/bin/R --vanilla --slave)
##RCPPLIBS := $(shell echo 'Rcpp:::LdFlags()' | $(R_HOME)/bin/R --vanilla --slave)
## include headers and libraries for RInside embedding classes
RINSIDEINCL := $(shell echo 'RInside:::CxxFlags()' | $(R_HOME)/bin/R --vanilla --slave)
RINSIDELIBS := $(shell echo 'RInside:::LdFlags()' | $(R_HOME)/bin/R --vanilla --slave)
## compiler etc settings used in default make rules
ifeq ($(HOST_OS),darwin)
CXX := clang++ $(shell $(R_HOME)/bin/R CMD config CXX)
else
CXX := $(shell $(R_HOME)/bin/R CMD config CXX)
endif
CPPFLAGS := -Wall $(shell $(R_HOME)/bin/R CMD config CPPFLAGS)
CXXFLAGS := $(RCPPFLAGS) $(RCPPINCL) $(RINSIDEINCL) $(shell $(R_HOME)/bin/R CMD config CXXFLAGS)
LDLIBS := $(RLDFLAGS) $(RRPATH) $(RBLAS) $(RLAPACK) $(RCPPLIBS) $(RINSIDELIBS)
#########################################
CUDA_HOME = /usr/local/cuda-9.1
# This defines what the shared object libraries will be
PKG_LIBS= -L/usr/local/cuda-9.1/lib64 -Wl,-rpath,/usr/local/cuda-9.1/lib64 -lcudart -d
NVCC = $(CUDA_HOME)/bin/nvcc
CUDA_INC = $(CUDA_HOME)/include
CUDA_LIB = $(CUDA_HOME)/lib64
R_INC = /usr/share/R/include
LIBS = -lcudart -d
NVCC_FLAGS = -Xcompiler "-fPIC" -I$(R_INC)
##-gencode arch=compute_20,code=sm_20 -gencode arch=compute_30,code=sm_30 -gencode arch=compute_35,code=sm_35
### Define objects
cu_sources := $(wildcard *cu)
cu_sharedlibs := $(patsubst %.cu, %.o,$(cu_sources))
cpp_sources := $(wildcard *.cpp)
cpp_sharedlibs := $(patsubst %.cpp, %.o, $(cpp_sources))
OBJECTS = $(cu_sharedlibs) $(cpp_sharedlibs)
all : test.exe
test.exe: $(OBJECTS)
%.o: %.cpp $(cpp_sources)
$(CXX) $< -c -fPIC -I$(CPPFLAGS) $(CXXFLAGS) $(LDLIBS)
%.o: %.cu $(cu_sources)
$(NVCC) $(NVCC_FLAGS) -I$(CUDA_INC) $< -c
当我"使"makefile正确编译所有内容时,我会获得.o
文件,但无法创建可执行文件。当我试图用"nvcc
test.o
cuda.o
"编译它们时,我得到了以下错误:
pesco@pesco-PC:~/Scrivania/PURECUDA$ nvcc -o someCUDAcode.o test.o
test.o: nella funzione "Rcpp::Rstreambuf<false>::xsputn(char const*, long)":
/home/pesco/R/x86_64-pc-linux-gnu-library/3.2/Rcpp/include/Rcpp/iostream/Rstreambuf.h:56: riferimento non definito a "REprintf"
test.o: nella funzione "Rcpp::Rstreambuf<false>::sync()":
/home/pesco/R/x86_64-pc-linux-gnu-library/3.2/Rcpp/include/Rcpp/iostream/Rstreambuf.h:80: riferimento non definito a "R_FlushConsole"
test.o: nella funzione "Rcpp::Rstreambuf<true>::sync()":
/home/pesco/R/x86_64-pc-linux-gnu-library/3.2/Rcpp/include/Rcpp/iostream/Rstreambuf.h:76: riferimento non definito a "R_FlushConsole"
test.o: nella funzione "Rcpp::Rstreambuf<true>::xsputn(char const*, long)":
/home/pesco/R/x86_64-pc-linux-gnu-library/3.2/Rcpp/include/Rcpp/iostream/Rstreambuf.h:52: riferimento non definito a "Rprintf"
/home/pesco/R/x86_64-pc-linux-gnu-library/3.2/Rcpp/include/Rcpp/iostream/Rstreambuf.h:52: riferimento non definito a "Rprintf"
test.o: nella funzione "Rcpp::Rstreambuf<false>::xsputn(char const*, long)":
/home/pesco/R/x86_64-pc-linux-gnu-library/3.2/Rcpp/include/Rcpp/iostream/Rstreambuf.h:56: riferimento non definito a "REprintf"
test.o: nella funzione "main":
/home/pesco/Scrivania/PURECUDA/test.cpp:18: riferimento non definito a "RInside::RInside(int, char const* const*, bool, bool, bool)"
/home/pesco/Scrivania/PURECUDA/test.cpp:19: riferimento non definito a "someCUDAcode"
/home/pesco/Scrivania/PURECUDA/test.cpp:18: riferimento non definito a "RInside::~RInside()"
collect2: error: ld returned 1 exit status
但我不知道如何处理这个错误。如何将它们正确地连接在一起?谢谢:(
我正在使用:
CUDA 9.1:
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Nov__3_21:07:56_CDT_2017
Cuda compilation tools, release 9.1, V9.1.85
NVIDIA驱动程序:
pesco@pesco-PC:~/Scrivania/PURECUDA$ nvidia-smi
Mon Jul 23 11:16:50 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.48 Driver Version: 390.48 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GT 740M Off | 00000000:01:00.0 N/A | N/A |
| N/A 58C P8 N/A / N/A | 110MiB / 2004MiB | N/A Default |
+-------------------------------+----------------------+----------------------+
UBUNTU 16.04 LTSG++:G++(Ubuntu 5.4.0-6ubuntu1~16.04.10(5.4.0 20160609
我希望我说得清楚,对不起我的英语!
正如@talonmies所建议的,你可以在用g++编译CUDA对象文件和库的同时解决"非引用错误",确切地说,我在RInside的示例文件夹中创建了一个新的makefile,然后我将.o和.的路径添加到LDLIBS中,所以我刚刚从之前的编译中获得,一切都正常,我不知道它是否正常工作,但至少我们有一个可执行文件!确切地说,这是新的makefile:
R_HOME := $(shell R RHOME)
sources := $(wildcard *.cpp)
programs := $(sources:.cpp=)
## include headers and libraries for R
RCPPFLAGS := $(shell $(R_HOME)/bin/R CMD config --cppflags)
RLDFLAGS := $(shell $(R_HOME)/bin/R CMD config --ldflags)
RBLAS := $(shell $(R_HOME)/bin/R CMD config BLAS_LIBS)
RLAPACK := $(shell $(R_HOME)/bin/R CMD config LAPACK_LIBS)
## if you need to set an rpath to R itself, also uncomment
#RRPATH := -Wl,-rpath,$(R_HOME)/lib
## include headers and libraries for Rcpp interface classes
## note that RCPPLIBS will be empty with Rcpp (>= 0.11.0) and can be omitted
RCPPINCL := $(shell echo 'Rcpp:::CxxFlags()' | $(R_HOME)/bin/R --vanilla --slave)
RCPPLIBS := $(shell echo 'Rcpp:::LdFlags()' | $(R_HOME)/bin/R --vanilla --slave)
##NVCC HEADER AND DECLARATION TO CREATE THE CUDA OBJECT FILE
## include headers and libraries for RInside embedding classes
RINSIDEINCL := $(shell echo 'RInside:::CxxFlags()' | $(R_HOME)/bin/R --vanilla --slave)
RINSIDELIBS := $(shell echo 'RInside:::LdFlags()' | $(R_HOME)/bin/R --vanilla --slave)
## compiler etc settings used in default make rules
CXX := $(shell $(R_HOME)/bin/R CMD config CXX)
CPPFLAGS := -Wall $(shell $(R_HOME)/bin/R CMD config CPPFLAGS)
CXXFLAGS := $(RCPPFLAGS) $(RCPPINCL) $(RINSIDEINCL) $(shell $(R_HOME)/bin/R CMD config CXXFLAGS)
LDLIBS := $(RLDFLAGS) $(RRPATH) $(RBLAS) $(RLAPACK) $(RCPPLIBS) $(RINSIDELIBS) /home/pesco/Scrivania/NEWTRY/someCUDAcode.o /usr/local/cuda/lib64/libcudart.so
all: $(programs)
@test -x /usr/bin/strip && strip $^
run: $(programs)
clean:
rm -vf $(programs)
rm -vrf *.dSYM
以及新的.cpp:
#include <RInside.h>
extern "C"
void someCUDAcode();
// for the embedded R via RInside
int main(int argc, char *argv[]) {
RInside R(argc, argv); // create an embedded R instance
someCUDAcode();
R["txt"] = "Hello, world!n"; // assign a char* (string) to 'txt'
R.parseEvalQ("cat(txt)"); // eval the init string, ignoring any returns
exit(0);
}
这就是我通过"制作"获得的:
g++ -I/usr/share/R/include -I/home/pesco/R/x86_64-pc-linux-gnu-library/3.2/Rcpp/include -I/home/pesco/R/x86_64-pc-linux-gnu-library/3.2/RInside/include -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -Wall rinside_sample0.cpp -Wl,--export-dynamic -fopenmp -L/usr/lib/R/lib -lR -lpcre -llzma -lbz2 -lz -lrt -ldl -lm -lblas -llapack -L/home/pesco/R/x86_64-pc-linux-gnu-library/3.2/RInside/lib -lRInside -Wl,-rpath,/home/pesco/R/x86_64-pc-linux-gnu-library/3.2/RInside/lib /home/pesco/Scrivania/NEWTRY/someCUDAcode.o /usr/local/cuda/lib64/libcudart.so -o rinside_sample0
并运行可执行文件:
pesco@pesco-PC:~/Scrivania/NEWTRY$ ./rinside_sample0
Hello, world!
相关文章:
- 使用nvcc(CUDA-RINSIDE)正确链接对象文件
- 如何在Linux中使用GLFW函数正确链接C++对象?
- 无法链接".o"对象文件
- C 链接对象列表
- 如何在Visual Studio中未经编造的链接对象名称
- 从最基本的Qt应用程序重新链接对象 - 链接器错误
- g++链接对象文件无法链接
- 链接对象文件和静态库时出现多定义错误
- 链接对象和静态库
- 警告LNK4206:找不到预编译类型信息; 未链接或覆盖;链接对象,就好像没有调试信息一样
- 使用 G++ 链接对象时出现问题
- c++链接错误:无法链接对象
- so中未定义的符号(在链接对象中定义)
- C++链接对象的文件 (G++)
- 链接.o (C对象文件)到Linux上的c++文件/项目
- 清理链接对象的动态内存
- 限制链接对象的全局符号的作用域
- 如何在不使用makefile的情况下链接对象文件和库
- 在运行时链接c++对象
- 从一个链接对象到另一个链接对象的访问