Modification du nom du noyau PTX

Oct 03 2020

Je ne peux pas lier mon programme Cuda lorsqu'un noyau est compilé à partir d'un ptxfichier.

main.cu:

extern 
__global__ void kernel(int, float*);

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

kernel.cu

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

Si je compile comme ci-dessous, je n'ai aucun problème et j'obtiens un exécutable:

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

Si je compile comme ci-dessous (en générant ptx), j'obtiens des erreurs:

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

Erreur:

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

Je suis un exemple de CUDA_Compiler_Driver_NVCC.pdf.

Que dois-je faire pour corriger l'erreur?

(Ceci est CUDA 10.2).

Réponses

2 RobertCrovella Oct 02 2020 at 23:46

Si vous souhaitez écrire votre propre PTX (ou modifier PTX), la méthodologie CUDA appropriée à utiliser est l'API du pilote CUDA et le flux de compilation associé.

L' vectorAddDrv exemple de code CUDA contient toute la plomberie et le flux de travail dont vous avez besoin.