2013-11-25 86 views
-1

我的Ubuntu 12.04服務器中安裝了cuda 4.0工具包。當我嘗試構建Rodinia基準套件中存在的cuda代碼時。我收到以下錯誤。即,運行make命令錯誤未定義引用'cutCreateTimer'

[email protected]:~/Downloads/rodinia_2.4$ make 
cd cuda/cfd;   make; cp euler3d euler3d_double pre_euler3d pre_euler3d_double /home/ncclab/Downloads/rodinia_2.4/bin/linux/cuda 
make[1]: Entering directory `/home/ncclab/Downloads/rodinia_2.4/cuda/cfd' 
nvcc -O2 -Xptxas -v --gpu-architecture=compute_20 --gpu-code=compute_20 euler3d.cu -o euler3d -I/if10/kw5na/NVIDIA_GPU_Computing_SDK4/C/common/inc -L/if10/kw5na/NVIDIA_GPU_Computing_SDK4/C/lib 
euler3d.cu:35: warning: #warning "the kernels may fail too launch on some systems if the block length is too large" 
euler3d.cu:35: warning: #warning "the kernels may fail too launch on some systems if the block length is too large" 

通過這裏後euler3d建

nvcc -Xptxas -v -O3 --gpu-architecture=compute_20 --gpu-code=compute_20 euler3d_double.cu -o euler3d_double -I/if10/kw5na/NVIDIA_GPU_Computing_SDK4/C/common/inc -L/if10/kw5na/NVIDIA_GPU_Computing_SDK4/C/lib 
/tmp/tmpxft_0000532d_00000000-12_euler3d_double.o: In function `main': 
tmpxft_0000532d_00000000-1_euler3d_double.cudafe1.cpp:(.text+0x22d9): undefined reference to `cutCreateTimer' 
tmpxft_0000532d_00000000-1_euler3d_double.cudafe1.cpp:(.text+0x22f7): undefined reference to `cutStartTimer' 
tmpxft_0000532d_00000000-1_euler3d_double.cudafe1.cpp:(.text+0x2457): undefined reference to `cutStopTimer' 
tmpxft_0000532d_00000000-1_euler3d_double.cudafe1.cpp:(.text+0x246c): undefined reference to `cutGetAverageTimerValue' 

collect2: ld returned 1 exit status 
make[1]: *** [euler3d_double] Error 1 
make[1]: Leaving directory `/home/ncclab/Downloads/rodinia_2.4/cuda/cfd' 
cp: cannot stat `euler3d_double': No such file or directory 
cp: cannot stat `pre_euler3d': No such file or directory 
cp: cannot stat `pre_euler3d_double': No such file or directory 
make: *** [CUDA] Error 1 

通過搜索我才知道,有可能是libcutil 一個問題,但我曾在libcutil_x86_64.a 〜/ NVIDIA_GPU_Computing_SDK/C/lib目錄

編輯:不同的文件夾中的內容是 ncclab @ slave13:〜/ NVIDIA_GPU_Computing_SDK/C/lib目錄$ LS

libcutil_x86_64.a libparamgl_x86_64.a librendercheckgl_x86_64.a 

〜/下載/ rodinia_2.4/CUDA/CFD $ LS

euler3d  euler3d_double.cu Makefile~  pre_euler3d.cu   README 
euler3d.cu Makefile   Makefile_nvidia pre_euler3d_double.cu run 

ncclab @ slave13:〜/ NVIDIA_GPU_Computing_SDK/C /普通/ INC $ LS

bank_checker.h    cutil_inline.h   GL    nvVector.h   stopwatch_base.h 
cmd_arg_reader.h   cutil_inline_runtime.h multithreading.h nvWidgets.h   stopwatch_base.inl 
cuda_drvapi_dynlink.c  cutil_math.h   nvGlutWidgets.h paramgl.h   stopwatch.h 
cutil_gl_error.h   dynlink     nvGLWidgets.h  param.h    stopwatch_linux.h 
cutil_gl_inline.h   dynlink_d3d10.h   nvMath.h   rendercheck_d3d10.h 
cutil.h      dynlink_d3d11.h   nvMatrix.h  rendercheck_d3d11.h 
cutil_inline_bankchecker.h error_checker.h   nvQuaternion.h rendercheck_d3d9.h 
cutil_inline_drvapi.h  exception.h    nvShaderUtils.h rendercheck_gl.h 

部分內容的生成文件是

all: euler3d euler3d_double pre_euler3d pre_euler3d_double 

euler3d: euler3d.cu 
    nvcc -O2 -Xptxas -v --gpu-architecture=compute_20 --gpu-code=compute_20 euler3d.cu -o euler3d -I$(CUDA_SDK_PATH)/common/inc -L$(CUDA_SDK_PATH)/lib $(CUTIL_LIB) 

euler3d_double: euler3d_double.cu 
    nvcc -Xptxas -v -O3 --gpu-architecture=compute_20 --gpu-code=compute_20 euler3d_double.cu -o euler3d_double -I$(CUDA_SDK_PATH)/common/inc -L$(CUDA_SDK_PATH)/lib $(CUTIL_LIB) 


pre_euler3d: pre_euler3d.cu 
    nvcc -Xptxas -v -O3 --gpu-architecture=compute_20 --gpu-code=compute_20 pre_euler3d.cu -o pre_euler3d -I$(CUDA_SDK_PATH)/common/inc -L$(CUDA_SDK_PATH)/lib $(CUTIL_LIB) 

pre_euler3d_double: pre_euler3d_double.cu 
    nvcc -Xptxas -v -O3 --gpu-architecture=compute_20 --gpu-code=compute_20 pre_euler3d_double.cu -o pre_euler3d_double -I$(CUDA_SDK_PATH)/common/inc -L$(CUDA_SDK_PATH)/lib $(CUTIL_LIB) 

euler3d已成功構建。所有其餘三個文件都發生錯誤。所以我不認爲他們所指的目錄中有任何問題

我真的不明白爲什麼對'cutCreateTimer'等的未定義引用正在發生。但在SE中搜索我才知道,當cutil.h或libcutil出現任何問題時,這些問題就會退出。我是一個linux環境的新手。所以,請幫我

編輯2:在命名make.config如下的包括文件存在

# CUDA SDK installation path 
#SDK_DIR = $(HOME)/NVIDIA_GPU_Computing_SDK/C 
SDK_DIR =/if10/kw5na/NVIDIA_GPU_Computing_SDK4/C 
#SDK_DIR =/if10/kw5na/NVIDIA_CUDA_Computing_SDK4/C 

這裏默認選擇了第二個選項和euler3d建。所以我認爲可能有這個問題。但改變它不會改變我面臨

及有關問題的cutil庫目前make文件

CUDA_SDK_PATH := $(SDK_DIR) 

# Determine the correct version of the cutil library 
CUTIL_LIB = # -lcutil 
ifeq ($(shell uname -m), x86_64) 
    ifeq ($(shell if test -e $(SDK_DIR)/lib/libcutil_x86_64.a; then echo T; else echo F; fi), T) 
     CUTIL_LIB = #-lcutil_x86_64 
    endif 
endif 

我想這是正確的

+4

我低估了這個問題。你需要解釋上面出現的所有路徑,並告訴我們你的理解以及你想要做什麼? –

+0

@SagarMasuti對不起,我不太瞭解這個問題。所以我沒有寫出我所理解的...... –

+0

所以在'Makefile'中改變指向include路徑和lib路徑的變量指向你的cuda sdk,在那裏你向我們展示了'inc'和'lib',即'-I/if10/kw5na/NVIDIA_GPU_Computing_SDK4/C/common/inc'到'〜/ NVIDIA_GPU_Computing_SDK/C/common/inc'和'lib'相同。 –

回答

2

的問題是,你的編譯命令指定庫路徑,但不是提供cut...功能的庫本身。

這顯然是爲euler3d_double產生nvcc編譯命令Makefile行:

euler3d_double: euler3d_double.cu 
    nvcc -Xptxas -v -O3 --gpu-architecture=compute_20 --gpu-code=compute_20 euler3d_double.cu -o euler3d_double -I$(CUDA_SDK_PATH)/common/inc -L$(CUDA_SDK_PATH)/lib $(CUTIL_LIB) 

這是生成的編譯命令:

nvcc -Xptxas -v -O3 --gpu-architecture=compute_20 --gpu-code=compute_20 euler3d_double.cu -o euler3d_double -I/if10/kw5na/NVIDIA_GPU_Computing_SDK4/C/common/inc -L/if10/kw5na/NVIDIA_GPU_Computing_SDK4/C/lib 

你會注意到,在過去兩個記號在makefile行中有:

-L$(CUDA_SDK_PATH)/lib $(CUTIL_LIB) 

-L$...令牌正在轉換爲正確的庫路徑。但$(CUTIL_LIB)令牌應該轉換爲類似-lcutil-lcutil_x86_64,但這不會發生。因此,提供cut...Timer...函數的庫缺失,因此這些函數看起來是未定義的。

我會仔細檢查Makefile,看看是否有是指定euler3d_double應該如何建立和前行指定euler3d應該如何建行之間不同的任何最終的換行符或其他古怪。

你也應該能夠通過查看euler3d(你不顯示)產生的nvcc編譯命令行並將其與一個爲euler3d_double(這是不及格)證實了這一點。

+0

我編輯了這個問題以包含euler3d的案例 –

+1

您的'CUTIL_LIB'分配是錯誤的。爲什麼'-lcutil'和'-lcutil_x86_64'令牌被註釋掉了? –