我正在嘗試使用 編譯 cuda 模塊nvcc
,并使用g
編譯器編譯最終的主腳本。我看過這篇文章,但無法讓我的示例作業。我得到的錯誤似乎是一個鏈接錯誤:
nvcc -c -g -I -dlink -I/usr/local/cuda-11/include -I. -L/usr/local/cuda-11/lib64 -lcudart -lcurand module.cu -o module.o
g -I/usr/local/cuda-11/include -I. -L/usr/local/cuda-11/lib64 -lcudart -lcurand module.o main.cpp -o main
module.o: In function `call_kernel()':
/home/ubuntu/Desktop/CUDA/MPI&CUDA/module.cu:16: undefined reference to `__cudaPushCallConfiguration'
module.o: In function `__cudaUnregisterBinaryUtil()':
/usr/local/cuda-11/include/crt/host_runtime.h:259: undefined reference to `__cudaUnregisterFatBinary'
module.o: In function `__nv_init_managed_rt_with_module(void**)':
/usr/local/cuda-11/include/crt/host_runtime.h:264: undefined reference to `__cudaInitModule'
我究竟做錯了什么 ?我知道我可以簡單地編譯main.cpp
使用nvcc
,但它是我不想,因為在我的問題,我將代替g
與mpicxx
后來就有我的內部MPI代碼main.cpp
的腳本。
我的生成檔案是:
INC := -I$(CUDA_HOME)/include -I.
LIB := -L$(CUDA_HOME)/lib64 -lcudart -lcurand
CUDAFLAGS=-c -g -I -dlink $(INC) $(LIB)
all: main
main: module.o
g $(INC) $(LIB) module.o main.cpp -o main
module.o: module.cu module.h
nvcc -c -g -I -dlink $(INC) $(LIB) module.cu -o module.o
clean:
rm -rf *.o
主程式
#include "module.h"
int main(){
return 0;
}
模塊.cu
#ifdef __CUDACC__
#define CUDA_GLOBAL __global__
#else
#define CUDA_GLOBAL
#endif
#include <cuda.h>
#include "module.h"
CUDA_GLOBAL
void kernel(){
}
void call_kernel(){
kernel<<<1,1>>>();
}
模塊.h
#ifndef _MODULE_H_
#define _MODULE_H_
#ifdef __CUDACC__
#define CUDA_GLOBAL __global__
#else
#define CUDA_GLOBAL
#endif
#include <numeric>
#include <cuda.h>
CUDA_GLOBAL
void kernel();
void call_kernel();
#endif
uj5u.com熱心網友回復:
您的鏈接行錯誤。所有庫(例如,-lfoo
)必須在所有目標檔案(例如,檔案)之后出現在鏈接行的末尾.o
。
不僅如此,它們還需要正確排序(但我不知道正確的順序是什么,所以也許它們在上面是正確的)。
幾乎所有現代聯結器都是“單程”聯結器,這意味著它們只通過庫一次,并且由于它們只提取它們已經需要的符號,因此您必須首先使用“最高級別”內容訂購庫,并且“下級”內容如下。
uj5u.com熱心網友回復:
感謝 MadScientist 的解釋,鏈接必須在鏈接行的末尾完成,畢竟.o
檔案:
INC := -I$(CUDA_HOME)/include -I.
LIB := -L$(CUDA_HOME)/lib64 -lcudart -lcurand
all: main
main: module.o
mpicxx module.o main.cpp -o main $(INC) $(LIB)
module.o: module.cu module.h
nvcc -c -g module.cu -o module.o -I -dlink
clean:
rm -rf *.o
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/394769.html