Cuda CMake 3.10 CMakeLists.txt

Saya memiliki proyek visual c++ yang membuat dll. Untuk proyek ini saya memiliki CMakeLists.txt yang berfungsi.

Sekarang saya membuat dua file sumber cuda yang menyelesaikan proyek dan dengan visual studio build berfungsi dengan baik. Saya ingin menambahkan perintah yang cocok ke file cmake saya. Adakah yang bisa memberi tahu saya perintah dasar yang perlu saya tambahkan?

Saya mencoba membangun perpustakaan dll tempat saya menggunakan file .cu dan .cpp.... Bagian penting dari file cmake saya terlihat seperti:

# ----------------------------------------------------------------------------
# Set Cuda properties
# ----------------------------------------------------------------------------
enable_language(CUDA)
set(CUDA_SEPARABLE_COMPILATION ON)
set(CUDA_PROPAGATE_HOST_FLAGS OFF)
if (CMAKE_SIZEOF_VOID_P MATCHES 8)
  set(CUDA_64_BIT_DEVICE_CODE_DEFAULT ON)
endif()
set(CUDA_NVCC_FLAGS "-gencode arch=compute_50,code=sm_50;-rdc=true;-use_fast_math")

message(STATUS "CUDA_PROPAGATE_HOST_FLAGS: ${CUDA_PROPAGATE_HOST_FLAGS}")
message(STATUS "CUDA_HOST_COMPILER: ${CUDA_HOST_COMPILER}")
message(STATUS "CUDA_NVCC_FLAGS: ${CUDA_NVCC_FLAGS}")

# ----------------------------------------------------------------------------
# Create shared library project
# ----------------------------------------------------------------------------
add_library(${LIB_NAME} SHARED ${HEADERS} ${SOURCES} ${CUDA_SOURCES})
set(CUDA_LIBRARIES "cudadevrt.lib;cudart.lib")
target_link_libraries(${LIB_NAME} ${CUDA_LIBRARIES})

Tapi itu tidak mengkompilasi file cuda dengan flag yang tepat. Juga di visual studio, definisi praprosesor juga ada di bagian cuda properti....ada saran?


person Dominik    schedule 11.04.2018    source sumber
comment
Kemungkinan duplikat CMake: cara menambahkan cuda ke proyek yang ada   -  person halfelf    schedule 11.04.2018
comment
@halfelf: satu-satunya jawaban untuk pertanyaan referensi menjelaskan penggunaan find_package(CUDA). Sekarang CUDA didukung oleh CMake sebagai bahasa (sama seperti C, CXX atau Fortran), sehingga tanda terima diubah. Sampai pertanyaan yang direferensikan mendapatkan jawaban di CMake baru, saya memilih untuk tidak menjadikannya sebagai duplikat. Sayangnya saya tidak terlalu mengenal CUDA sehingga tidak bisa mempersiapkan jawaban tersebut.   -  person Tsyvarev    schedule 11.04.2018
comment
@Tsyvarev Terima kasih atas tipnya. Saya sudah mencoba enable_language(CUDA) di proyek saya. Namun, saya tetap menyarankan menggunakan fungsi/variabel seri find_package(CUDA), karena tampaknya sulit untuk menemukan dokumen apa pun tentang cara menautkan/menyertakan perpustakaan/header cuda lain seperti npp, curand, dll.   -  person halfelf    schedule 11.04.2018
comment
Blog pengembang Nvidia memiliki penjelasan bagus tentang melakukan hal ini dengan CMake 3.8+: devblogs.nvidia. com/building-cuda-applications-cmake   -  person gflegar    schedule 11.04.2018
comment
@halfelf apa yang Anda maksud dengan perpustakaan/header cuda, sebagian besar perpustakaan yang diproduksi Nvidia sebenarnya adalah perpustakaan C atau C++ yang memanggil kernel CUDA, jadi Anda cukup menautkan/menyertakannya seperti perpustakaan lainnya. Inilah cara kami melakukannya untuk cuBLAS dan cuSPARSE di perpustakaan yang saya kembangkan: github.com/ginkgo-project/ginkgo/blob/develop/gpu/   -  person gflegar    schedule 11.04.2018
comment
Konkritnya, untuk NPP yang Anda sebutkan, saya tidak melihat apa pun dalam proses penautan yang tidak akan ditangani oleh CMake secara otomatis: docs.nvidia.com/cuda/npp/index.html   -  person gflegar    schedule 11.04.2018
comment
@GoranFlegar Terima kasih atas contoh dan devblognya. Maksud saya ketika menggunakan find_package(CUDA), pertama saya tidak memerlukan CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES untuk header, dan saya juga tidak memerlukan find_library() untuk setiap cuda lib, karena sudah ditetapkan sebagai variabel CUDA_xxx_LIBRARY. Bagi saya, fitur baru ini terasa sedikit lebih rumit daripada find_package(cuda) yang lama, atau mungkin saya ketinggalan?   -  person halfelf    schedule 11.04.2018
comment
@halfelf Anda tidak memerlukan CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES jika Anda membuat file .cu, hanya jika Anda memanggil CUDA runtime API dari file .c/.cpp. Untuk perpustakaan, itu benar, mereka belum menetapkannya sebelumnya, tetapi Anda selalu dapat membuat skrip pembungkus kecil untuk itu, dan memasukkannya ke dalam semua proyek Anda.   -  person gflegar    schedule 12.04.2018
comment
Ada juga kelemahan menggunakan FindCUDA: Di versi CMake sebelumnya, membuat kode CUDA memerlukan perintah seperti cuda_add_library. Sayangnya, perintah ini tidak dapat berpartisipasi dalam persyaratan penggunaan, dan oleh karena itu akan gagal menggunakan tanda atau definisi kompiler yang disebarkan. (dari devblog yang saya tautkan di atas).   -  person gflegar    schedule 12.04.2018
comment
Apakah saya menyetel flag nvcc dengan cara yang salah....penyiapan proyek coba lakukan kompilasi selalu dengan komputasi_20,sm_20?   -  person Dominik    schedule 12.04.2018
comment
@Dominik apakah Anda menggunakan paket findCUDA yang sudah tidak digunakan lagi atau dukungan bawaan? CUDA_NVCC_FLAGS adalah variabel yang digunakan oleh findCUDA, dukungan CUDA bawaan menggunakan CMAKE_CUDA_FLAGS sebagai gantinya. Ya, memiliki dua pilihan memang sangat membingungkan, jadi Anda harus berhati-hati dalam melakukannya.   -  person gflegar    schedule 14.04.2018


Jawaban (1)


Saya akan mencoba menjawab pertanyaan ini menggunakan diskusi dari komentar dan menambahkan beberapa informasi tambahan.

Pertama-tama, ada dua cara untuk mengaktifkan dukungan CUDA di CMake. Salah satunya adalah FindCUDA module yang lama, dan yang lainnya adalah modul bawaan yang baru. dalam dukungan bahasa CUDA ditambahkan di CMake 3.8, dan dijelaskan di sini. Anda dapat memilih satu atau yang lain (tetapi Anda mungkin ingin menggunakan dukungan bawaan untuk proyek baru), tetapi Anda harus tetap pada pilihan Anda.

Untuk menggunakan dukungan bawaan, Anda dapat menambahkannya ke pernyataan project(...) atau menggunakan:

enable_language(CUDA);

Untuk menggunakan paket FindCUDA lama, Anda akan menggunakan:

find_package(CUDA);

Perhatikan bahwa kedua opsi tersebut menggunakan variabel yang sepenuhnya berbeda untuk penyiapan. Untuk melihat variabel apa saja yang didukung oleh FindCUDA lihat halaman ini, dan untuk variabel bawaan -dalam dukungan CUDA lihat ini (jangan lupa placeholder <LANG> dapat diganti dengan bahasa apa pun, artinya CUDA juga merupakan salah satu substitusi yang tersedia).

Misalnya. dengan FindCUDA Anda akan menggunakan CUDA_NVCC_FLAGS untuk menyetel flag kompiler secara manual, dan dengan dukungan bahasa bawaan Anda akan menggunakan CMAKE_CUDA_FLAGS untuk tujuan yang sama. Sebagai aturan praktis: jika variabel dimulai dengan CUDA_ maka itu adalah bagian dari paket FindCUDA, dan jika dimulai dengan CMAKE_, maka itu adalah bagian dari dukungan bawaan.

person gflegar    schedule 14.04.2018
comment
Entah bagaimana, untuk proyek saya yang menggunakan cuda_gl_interop.h dan cuda_runtime_api, cukup menambahkan project(... CUDA) menghasilkan kesalahan tautan, mengeluh ` referensi tidak terdefinisi ke cudaSetDevice' dll. Jadi saya menggunakan find_paclage(CUDA) dan cuda_add_executable dan tautannya baik-baik saja. - person yuqli; 31.07.2020