Mangling tên hạt nhân PTX

Oct 03 2020

Tôi không thể liên kết chương trình Cuda của mình khi hạt nhân được biên dịch từ ptxtệp.

main.cu:

extern 
__global__ void kernel(int, float*);

int main()
{
    ...
    kernel<<<...>>>(...);
    ...
}

kernel.cu

__global__
void kernel(int n, float* p)
{
    ...
}

Nếu tôi biên dịch như bên dưới, tôi không gặp vấn đề gì và tôi nhận được tệp thực thi:

nvcc -dc main.cu kernel.cu --gpu-architecture=sm_70
nvcc -dlink main.o kernel.o --gpu-architecture=sm_70 -o dlink.o
g++ dlink.o main.o kernel.o -lcudart

Nếu tôi biên dịch như dưới đây (bằng cách tạo ptx), tôi gặp lỗi:

nvcc -ptx kernel.cu --gpu-architecture=sm_70
nvcc -dc main.cu kernel.ptx --gpu-architecture=sm_70
nvcc -dlink main.o kernel.o --gpu-architecture=sm_70 -o dlink.o
g++ dlink.o main.o kernel.o -lcudart

Lỗi:

main.o: In function `main':
tmpxft_0000b5ce_00000000-5_main.cudafe1.cpp:(.text+0x4789): undefined reference to `kernel(int, float*)'
tmpxft_0000b5ce_00000000-5_main.cudafe1.cpp:(.text+0x497e): undefined reference to `kernel(int, float*)'
collect2: error: ld returned 1 exit status

Tôi đang làm theo một ví dụ từ CUDA_Compiler_Driver_NVCC.pdf.

Tôi cần làm gì để sửa lỗi?

(Đây là CUDA 10.2).

Trả lời

2 RobertCrovella Oct 02 2020 at 23:46

Nếu bạn muốn viết PTX của riêng mình (hoặc sửa đổi PTX), phương pháp CUDA thích hợp để sử dụng là API trình điều khiển CUDA và quy trình biên dịch liên quan.

vectorAddDrv Mã mẫu CUDA có tất cả hệ thống ống nước và quy trình làm việc mà bạn cần.