2

今日、4.2 から cuda 5.0 に更新しましたが、次のようなリンク エラーが多数発生します。

AddLevel.o: In function __sti____cudaRegisterAll_43_tmpxft_000034f6_00000000_6_AddLevel
_cpp1_ii_f49b3b40':/tmp/tmpxft_000034f6_00000000-3_AddLevel.cudafe1.stub.c:8: undefined
reference to `__cudaRegisterLinkedBinary_43_tmpxft_000034f6_00000000_6_AddLevel_cpp1_ii
_f49b3b40.

すべてのオブジェクト ファイルの後に、このようなエラーが続きます。

検索した多くの投稿で示唆されているように、リンク コマンドの最後にいくつかの cuda ライブラリを追加しましたが、それでも機能しません。

nvcc  -O3 -o iTrace*.o -L/usr/local/hdf5/lib -L/usr/local/cuda/lib64
`sdl-config--libs` -lhdf5 -lmfhdf -ldf -ljpeg -lz -lcuda -lcudart -lcublas_device 
-lcudadevrt.

誰でもこれについて私を助けることができますか? 必要な場合に備えて、完全な Makefile を最後に置きます。また、Kubuntu 12.04 64 ビット バージョンを使用しています。私の GPU は、コンピューティング機能 2.1 を備えた GeForce GTX 550 Ti です。また、ソース ファイルのサフィックス名をすべて .C から .cu に変更しましたが、それらの多くにはデバイス コードが含まれていません。それが問題かどうかはわかりません。ただし、nvcc 4.2 で動作します。

ところで、アンダースコアと数字を含む奇妙な長いファイル名はどのように生成されるのでしょうか? /usr/local/cuda/lib64 内のライブラリ ファイルを検索したところ、 で始まるすべての関数がand__cudaRegisterLinkedBinary_XX(a number here)_に含まれていることがわかりました。したがって、これらの -l オプションを追加しても機能するはずですが、機能しません。libcublas_device.alibcudadevrt.a

どうもありがとう。

これが私の Makefile です。

HDF_DIR = /usr/local/hdf5
HDF_INCLUDE = /usr/local/hdf5/include
X11_DIR = /usr/X11R6
PRECISION = r8

COMPILER="gnu"
DEBUG="no"
OPENMP="no"

ifeq ($(COMPILER), "gnu")
CC = nvcc 
CCxx = nvcc
LDR = nvcc 
ifeq ($(DEBUG), "yes")
CFLAGS = -O0
LDFLAGS = -O0
else
CFLAGS = -O3
LDFLAGS = -O3
endif
ifeq ($(OPENMP),"yes")
CFLAGS += -fopenmp
LDFLAGS += -fopenmp
endif
endif

ifeq ($(COMPILER), "intel")
CC = icc
CCxx = icpc
LDR = icpc
ifeq ($(DEBUG), "yes")
CFLAGS = -O0
LDFLAGS = -O0
else
CFLAGS = -fast
LDFLAGS = -fast
endif
ifeq ($(OPENMP),"yes")
CFLAGS += -openmp
LDFLAGS += -openmp
endif
endif

DEFINES = INCLUDE = -I. -I$(HDF_INCLUDE) `sdl-config --cflags` -I$(X11_DIR)/include

LIBS = -L$(HDF_DIR)/lib `sdl-config --libs` -L/usr/local/cuda/lib64\
-lhdf5 -lmfhdf -ldf -ljpeg -lz -lcuda -lcudart -lcublas_device -lcudadevrt


OBJS =  AddLevel.o          \
    CreateNewRays.o         \
    DefineFieldNames.o      \
    FieldsToLoad.o          \
    FindField.o         \
    GetGrid.o           \
    Grid_ComputeVertexData.o    \
    Grid_FindNeighbors.o        \
    Grid_LoadDataHDF4.o     \
    Grid_LoadDataHDF5.o     \
    Grid_ReadGridProperties.o   \
    Grid_SetSubgridMarker.o     \
    Grid_constructor.o      \
    Grid_destructor.o       \
    InterpretKeyPress.o     \
    LoadCT.o            \
    Load_RGBA.o         \
    ListIO.o            \
    Ray_GridBoundaryCheck.o     \
    Ray_Initialize.o        \
    Ray_InterpolateValue.o      \
    Ray_Trace.o         \
    Ray_constructor.o       \
    RayTraceInteractive.o       \
    LoadAllData.o  \
    ReadGridInfo.o          \
    ReadHierarchyEntry.o        \
    ResetReloadFlag.o       \
    UnloadAllData.o         \
    UnloadGrids.o           \
    UpdateScreen.o          \
    TraceAllRays.o          \
    camera.o            \
    my_vector.o         \
    print_help.o

%.o:%.cu
$(CCxx) -arch=sm_21 -rdc=true $(DEFINES) $(INCLUDE) -D$(PRECISION) -g -dc
    $(CFLAGS)    $*.cu

iTrace: $(OBJS)
$(LDR) $(LDFLAGS) -o iTrace $(OBJS) $(LIBS) 

clean:
rm -f *~ *.o iTrace

${OBJS}: typedef.h Grid.h my_vector.h Ray.h precision.h colors.h render.h 
4

1 に答える 1

1

それは変です。今日、cuda 4.2 から cuda 5 にアップグレードしましたが、makefile には既に含まれてい-rdc=trueますか? とにかく、定義に追加-arch=sm_21してみてくださいLDFLAGS。つまり、LDFLAGS = -O3 -arch=sm_21(makefile の gnu セクションで。おそらく のデバッグ定義と非デバッグ定義の両方で実行する必要がありますLDFLAGS)、発生している問題はhereで説明されていると思います。

于 2013-03-08T05:22:00.867 に答える