Cuda 5.0链接错误

Cuda 5.0链接错误,cuda,nvcc,Cuda,Nvcc,我的项目在Linux机器上使用CUDA4.2开发环境编译得很好 最近它升级到了CUDA 5.0,现在编译失败,并显示以下错误消息 In file included from /opt/cuda/bin/crt/link.stub:79:0: /tmp/tmpxft_000018c8_00000000-1_GPUReax_dlink.reg.c:2:1: error: redefinition of 'const unsigned char def_module_id_str__NV_MODULE

我的项目在Linux机器上使用
CUDA4.2
开发环境编译得很好

最近它升级到了
CUDA 5.0
,现在编译失败,并显示以下错误消息

In file included from /opt/cuda/bin/crt/link.stub:79:0:
/tmp/tmpxft_000018c8_00000000-1_GPUReax_dlink.reg.c:2:1: error: redefinition of 'const unsigned char def_module_id_str__NV_MODULE_ID []'
/tmp/tmpxft_000018c8_00000000-1_GPUReax_dlink.reg.c:1:1: error: 'const unsigned char def_module_id_str__NV_MODULE_ID [19]' previously defined here
/tmp/tmpxft_000018c8_00000000-1_GPUReax_dlink.reg.c: In function 'void __cudaRegisterLinkedBinary__NV_MODULE_ID(void (*)(void**), void*, void*)':
/tmp/tmpxft_000018c8_00000000-1_GPUReax_dlink.reg.c:2:1: error: redefinition of 'void __cudaRegisterLinkedBinary__NV_MODULE_ID(void (*)(void**), void*, void*)'
/tmp/tmpxft_000018c8_00000000-1_GPUReax_dlink.reg.c:1:1: error: 'void __cudaRegisterLinkedBinary__NV_MODULE_ID(void (*)(void**), void*, void*)' previously defined here
我正在使用linux机器

mctesla 93 $ uname -a
Linux mctesla.cs.purdue.edu 3.7.1 #1 SMP Fri Dec 28 12:08:12 EST 2012 x86_64 Intel(R) Xeon(R) CPU E5606 @ 2.13GHz GenuineIntel GNU/Linux
mctesla 94 $ 
有人能就如何使用CUDA 5.0环境解决此问题发表意见吗

更新-----

谢谢你的及时评论

我昨天花了一整天的时间来解决这个问题。。在查看编译器输出后,我注意到以下行。。。。(以下*分隔)

nvcc-I-I-I/opt/cuda/include-D_uuse_-GPU_uuu-arch=sm_20-Xptxas=-v-L/opt/cuda/lib64-lm-lz-lcuda-lcudart-GMRES.o QEq.o allocate.o analyze.o bond_orders.o box.o forces.o four.o四体交互.o grid.o init_md.o integrate.o list.o lookup.o邻居.o param.o param.o pdb_工具.o打印_tils.o重置_tils.o重启单体交互系统道具。o三体相互作用。o轨道。o两体相互作用。o向量。o测试MD。o cuda实用程序。o cuda复制。o cuda初始。o缩减。o中心质量。o辅助程序。o验证。o矩阵。o matvec.o-o GPUReax

在/opt/cuda/bin/crt/link中包含的文件中。存根:79:0:(*) /tmp/tmpxft_0000345f_00000000-1_GPUReax_dlink.reg.c:2:1:错误:重新定义“const unsigned char def_module_id_str_NV_module_id[]” /tmp/tmpxft_0000345f_00000000-1_GPUReax_dlink.reg.c:1:1:错误:“const unsigned char def_module_id_str_NV_module_id[19]”之前在此处定义


错误来自文件link.stub文件,这是CUDA 5.0安装中新增的文件。CUDA 4.2安装中不存在此文件

如果这有助于某人指出问题所在

谢谢你的帮助

苏希尔·凯拉萨


顺便说一句,这是我的Makefile

CC    = g++ 
NVCC   = nvcc

LIBS    = -L/opt/cuda/lib64 -lm -lz -lcuda -lcudart

CFLAGS  = -I.  -Wall -O3 -funroll-loops -fstrict-aliasing
NVCCFLAGS  = -I.  -I/opt/cuda/include -D__USE_GPU__ -arch=sm_20 -Xptxas=-v

#-finline-functions  -finline-limit=15 -g#-DTEST -pg -ldl -rdynamic -g
DEFS    = $(CFLAGS)
NVCCDEFS = $(NVCCFLAGS)

FLAG    = $(DEFS) $(INCS) $(LIBS)
NVCCFLAG = $(NVCCDEFS) $(LIBS)

OBJ      = GMRES.o QEq.o allocate.o analyze.o bond_orders.o \
     box.o forces.o four_body_interactions.o \
     grid.o init_md.o integrate.o list.o \
     lookup.o neighbors.o param.o pdb_tools.o \
     print_utils.o reset_utils.o \
     restart.o single_body_interactions.o \
     system_props.o three_body_interactions.o \
     traj.o two_body_interactions.o vector.o \
     testmd.o \
     cuda_utils.o cuda_copy.o cuda_init.o reduction.o \
     center_mass.o helpers.o validation.o matrix.o matvec.o

all:   beta

beta: $(OBJ) Makefile
   $(NVCC) $(NVCCFLAG) $(OBJ) -o GPUReax

param.o: param.c param.h mytypes.h traj.o
   $(CC) $(DEFS) -c param.c

traj.o: traj.c traj.h mytypes.h 
   $(CC) $(DEFS) -c traj.c

restart.o: restart.c restart.h mytypes.h box.h
   $(CC) $(DEFS) -c restart.c

pdb_tools.o: pdb_tools.c pdb_tools.h mytypes.h box.h list.h restart.h param.h
    $(CC) $(DEFS) -c pdb_tools.c

print_utils.o: print_utils.h print_utils.c
    $(CC) $(DEFS) -c print_utils.c

grid.o: grid.h grid.c
   $(CC) $(DEFS) -c grid.c


analyze.o: analyze.h analyze.c
   $(CC) $(DEFS) -c analyze.c

integrate.o: integrate.h integrate.c
   $(CC) $(DEFS) -c integrate.c

vector.o: vector.h vector.cu
   $(NVCC) $(NVCCDEFS) -c vector.cu

system_props.o: system_props.h system_props.cu
   $(NVCC) $(NVCCDEFS) -c system_props.cu

cuda_copy.o: cuda_copy.h cuda_copy.cu
   $(NVCC) $(NVCCDEFS) -c cuda_copy.cu

cuda_utils.o: cuda_utils.h cuda_utils.cu
   $(NVCC) $(NVCCDEFS) -c cuda_utils.cu

cuda_init.o: cuda_init.h cuda_init.cu
   $(NVCC) $(NVCCDEFS) -c cuda_init.cu

reduction.o: reduction.h reduction.cu
   $(NVCC) $(NVCCDEFS) -c reduction.cu

center_mass.o: center_mass.h center_mass.cu
   $(NVCC) $(NVCCDEFS) -c center_mass.cu

box.o: box.h
   $(NVCC) $(NVCCDEFS) -c box.cu

init_md.o: init_md.h init_md.cu
   $(NVCC) $(NVCCDEFS) -c init_md.cu

helpers.o: helpers.h helpers.cu
   $(NVCC) $(NVCCDEFS) -c helpers.cu

GMRES.o: GMRES.h GMRES.cu
   $(NVCC) $(NVCCDEFS) -c GMRES.cu

neighbors.o: neighbors.cu neighbors.h
   $(NVCC) $(NVCCDEFS) -c neighbors.cu

reset_utils.o: reset_utils.h reset_utils.cu mytypes.h list.h vector.h
   $(NVCC) $(NVCCDEFS) -c reset_utils.cu

list.o: list.h
   $(NVCC) $(NVCCDEFS) -c list.cu

forces.o: forces.h forces.cu
   $(NVCC) $(NVCCDEFS) -c forces.cu

allocate.o: allocate.h allocate.cu
   $(NVCC) $(NVCCDEFS) -c allocate.cu

lookup.o: lookup.h lookup.cu
   $(NVCC) $(NVCCDEFS) -c lookup.cu

two_body_interactions.o: two_body_interactions.h two_body_interactions.cu
   $(NVCC) $(NVCCDEFS) -c two_body_interactions.cu

bond_orders.o: bond_orders.h bond_orders.cu
   $(NVCC) $(NVCCDEFS) -c bond_orders.cu

single_body_interactions.o: single_body_interactions.h single_body_interactions.cu
   $(NVCC) $(NVCCDEFS) -c single_body_interactions.cu

three_body_interactions.o: three_body_interactions.h three_body_interactions.cu
   $(NVCC) $(NVCCDEFS) -c three_body_interactions.cu

four_body_interactions.o: four_body_interactions.h four_body_interactions.cu
   $(NVCC) $(NVCCDEFS) -c four_body_interactions.cu

validation.o: validation.h validation.cu
   $(NVCC) $(NVCCDEFS) -c validation.cu

matrix.o: matrix.h matrix.cu
   $(NVCC) $(NVCCDEFS) -c matrix.cu

QEq.o: QEq.h QEq.cu
   $(NVCC) $(NVCCDEFS) -c QEq.cu

matvec.o: matvec.h matvec.cu
   $(NVCC) $(NVCCDEFS) -c matvec.cu

testmd.o: testmd.cu mytypes.h param.o traj.o restart.o pdb_tools.o list.o vector.o
   $(NVCC) $(NVCCDEFS) -c testmd.cu

clean:
   rm -f *.o *~ core 

当我想为
sm_35
编译时,我也遇到了同样的问题。我通过在
NVCCFLAGS
变量中替换以下部分来解决此问题:

-arch=sm_20 by -gencode arch=compute_10,code=sm_10 -gencode arch=compute_20,code=sm_20 -gencode arch=compute_30,code=sm_30 -gencode arch=compute_35,code=sm_35
希望能有帮助。

当我想为
sm_35
编译时,我遇到了同样的问题。我通过在
NVCCFLAGS
变量中替换以下部分来解决此问题:

-arch=sm_20 by -gencode arch=compute_10,code=sm_10 -gencode arch=compute_20,code=sm_20 -gencode arch=compute_30,code=sm_30 -gencode arch=compute_35,code=sm_35
希望能有帮助。

我猜CUDA 4.2的剩余部分仍在您的计算机上(构建环境或项目),因此您最终会混合使用库或同时链接到这两个版本。也许给出您的构建命令(nvcc命令行)会有所帮助。如果这是一个项目,你可以做一个
makeclean
或类似的工作,这可能会有所帮助。您是否能够构建其他CUDA应用程序,或者它们在尝试构建时都会失败?您是否进行了
makeclean
?我进行了多次makeclean。那没用。安装CUDA 5.0时,此安装中的所有示例代码都有效。今天,我们从头开始在这台机器上安装了CUDA 5.0,以确保这不是安装问题……这一定是新的CUDA 5.0软件本身的问题。这是我的直觉试试这个。要编译.cu文件,您需要调用
$(NVCC)-c file.cu
尝试将其更改为
$(NVCC)-dc file.cu
(对于每个文件)也将beta build命令更改为
$(NVCC)-rdc=true-link$(NVCCFLAG)$(OBJ)-o GPUReax
,看看结果如何我猜CUDA 4.2的剩余部分仍然在您的机器上(构建环境或项目),因此,您最终会混合使用库或同时链接到这两个版本。也许给出构建命令(nvcc命令行)会有所帮助。如果这是一个项目,你可以做一个
makeclean
或类似的工作,这可能会有所帮助。您是否能够构建其他CUDA应用程序,或者它们在尝试构建时都会失败?您是否进行了
makeclean
?我进行了多次makeclean。那没用。安装CUDA 5.0时,此安装中的所有示例代码都有效。今天,我们从头开始在这台机器上安装了CUDA 5.0,以确保这不是安装问题……这一定是新的CUDA 5.0软件本身的问题。这是我的直觉试试这个。要编译.cu文件,您需要调用
$(NVCC)-c file.cu
尝试将其更改为
$(NVCC)-dc file.cu
(对于每个文件)还将beta build命令更改为
$(NVCC)-rdc=true-link$(NVCCFLAG)$(OBJ)-o GPUReax
,并查看结果