Saya menggunakan NVRTC untuk mengkompilasi kernel. Panggilan API yang relevan adalah:

nvrtcResult nvrtcCreateProgram ( 
    nvrtcProgram* prog,
    const char* src,
    const char* name, 
    int  numHeaders, 
    const char** headers,
    const char** includeNames )

Seperti yang Anda lihat, sumbernya adalah string mentah, dan tidak terkait dengan file. Itu berarti bahwa ketika Anda --generate-line-info, Anda mendapatkan nomor baris, tetapi tidak ada nama file terkait. Dan itu berarti bahwa jika Anda kemudian menggunakan, katakanlah, NSight Compute - Anda tidak akan dapat melihat kode sumber kernel Anda.

Jelas, baik NSight Compute sendiri, maupun NVRTC itu sendiri, tidak dapat mengetahui bahwa sumber mentah dicerminkan dalam beberapa file. Tetapi harus ada beberapa cara untuk menyiasatinya:

  • Mungkin saya kehilangan sesuatu di NVRTC API yang dapat membuat sumber <-> file asosiasi?
  • Mungkin kita dapat memanipulasi program yang dikompilasi yang dihasilkan (cukup, tidak secara manual, atau menulis-saya-sendiri-baru-API) untuk membuat asosiasi?
  • Mungkin kita bisa memasukkan kode sumber ke dalam program yang dikompilasi entah bagaimana?
1
einpoklum 31 Desember 2020, 12:48

2 jawaban

Jawaban Terbaik

Tampaknya NVRTC tidak menyediakan nama file default, sehingga jika Anda menempatkan sumber Anda dalam file dengan nama itu - NSight Compute mungkin dapat menemukannya.

Nama yang Anda berikan ke nvrtcCreateProgram() sebagai argumen name.

Jadi, jika fungsi kernel Anda (yaitu fungsi __global__ Anda) ada di my_kernel.cuh, dan Anda menempatkan file ini di direktori kerja program profil (yang Anda beri tahu NSight Compute), atau di salah satu direktori sertakan, Anda membuat program dengannya, Anda akan dapat membaca sumber Anda. Jika direktori file asli sendiri juga merupakan salah satu direktori yang disertakan, maka Anda beruntung dan Anda bahkan tidak perlu membuat salinan.

1
einpoklum 31 Desember 2020, 14:30

Inilah solusi awal saya:

  1. Tempatkan sumber Anda dalam file, misalnya my_kernel.cuh.
  2. Buat stringnya:
    #include "my_kernel.cuh"
    
  3. Kompilasi hanya string ini menggunakan NVRTC

Sekarang, NVRTC adalah dapat mengaitkan sumber file yang disertakan dengan file, jadi hanya rintisan yang akan hilang dalam hal sumber<->asosiasi file.

Peringatan: Anda harus berhati-hati tentang jalur - jalur penyertaan NVRTC, direktori kerja tempat Anda menjalankan program vs direktori file sumber, dll.

1
einpoklum 10 Maret 2021, 11:09