2014-03-01 120 views
1

當我嘗試編譯簡單代碼時,出現了一個問題,那就是C++和Cuda代碼以分離的方式編譯。Dynamic Parallelism - 在編譯時鏈接錯誤時引用__cudaRegisterLinkedBinary的未定義引用 - 單獨編譯

這裏是我的代碼

main.cpp中:

#include "file.cuh" 

int main(void) 
{ 
    test(); 
    return 0; 
} 

file.cuh:

void test(void); 

file.cu:

#include <cuda.h> 
#include <cuda_runtime.h> 
#include <cstdio> 

#include "file.cuh" 

__global__ void printId(void) 
{ 
    printf("Hello from block %d \n", blockIdx.x); 
} 

__global__ void DynPara(void) 
{ 
    dim3 grid(2, 1, 1); 
    dim3 block(1, 1, 1); 

    printId<<< grid, block >>>(); 
} 

void test(void) 
{ 
    dim3 grid(1, 1, 1); 
    dim3 block(1, 1, 1); 

    dynPara<<< grid, block >>>(); 
} 

我編譯:

nvcc -arch=sm_35 -lcudadevrt -rdc=true -c file.cu 
g++ file.o main.cpp -L<path> -lcudart 

而這裏的錯誤,而編譯:

file.o: In function `__sti____cudaRegisterAll_39_tmpxft_00005b2f_00000000_6_file_cpp1_ii_99181f96()': 
tmpxft_00005b2f_00000000-3_file.cudafe1.cpp:(.text+0x1cd): undefined reference to `__cudaRegisterLinkedBinary_39_tmpxft_00005b2f_00000000_6_file_cpp1_ii_99181f96' 

操作系統:紅帽 卡:K20x

任何想法?

感謝

回答

6

這個問題是相當多的此recent question的副本。

除了編譯之外,動態並行還需要可重定位的設備代碼鏈接。您的nvcc命令行指定僅編譯操作(-rdc=true -c)。

g++不做任何設備代碼鏈接。因此,在這種情況下,使用g++進行最終的鏈接操作時,需要使用an extra device code link step

事情是這樣的:

nvcc -arch=sm_35 -rdc=true -c file.cu 
nvcc -arch=sm_35 -dlink -o file_link.o file.o -lcudadevrt -lcudart 
g++ file.o file_link.o main.cpp -L<path> -lcudart -lcudadevrt 
+0

由於它的工作原理 – user3018144

2

當使用CMake的,設置find_package()使可重定位裝置的代碼編譯和鏈接CUDA_SEPARABLE_COMPILATION前:

SET(CUDA_SEPARABLE_COMPILATION ON) 
find_package(CUDA QUIET REQUIRED) 
相關問題