Cuda CMake 3.10 CMakeLists.txt

ฉันมีโครงการ Visual c++ ซึ่งสร้าง dll สำหรับโปรเจ็กต์นี้ ฉันมี CMakeLists.txt ที่ใช้งานได้

ตอนนี้ฉันสร้างไฟล์ต้นฉบับ cuda สองไฟล์ซึ่งทำให้โปรเจ็กต์เสร็จสมบูรณ์ และด้วย Visual Studio บิลด์ก็ทำงานได้ดี ฉันต้องการเพิ่มคำสั่งที่ตรงกันลงในไฟล์ cmake ของฉัน ใครช่วยบอกคำสั่งพื้นฐานที่ฉันต้องเพิ่มได้ไหม

ฉันพยายามสร้างไลบรารี dll ที่ฉันใช้ไฟล์ .cu และ .cpp.... ส่วนสำคัญของไฟล์ cmake ของฉันดูเหมือนว่า:

# ----------------------------------------------------------------------------
# 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})

แต่มันไม่ได้รวบรวมไฟล์ cuda ด้วยแฟล็กที่ถูกต้อง นอกจากนี้ใน Visual Studio คำจำกัดความของตัวประมวลผลล่วงหน้ายังอยู่ในส่วน cuda ของคุณสมบัติด้วย....ข้อเสนอแนะใด ๆ


person Dominik    schedule 11.04.2018    source แหล่งที่มา
comment
อาจซ้ำกันของ CMake: วิธีเพิ่ม cuda ในโครงการที่มีอยู่   -  person halfelf    schedule 11.04.2018
comment
@halfelf: คำตอบเดียวสำหรับคำถามอ้างอิงที่อธิบายการใช้งานของ find_package(CUDA) ขณะนี้ CUDA ได้รับการสนับสนุนโดย CMake เป็นภาษา (เหมือนกับ C, CXX หรือ Fortran) ดังนั้นใบเสร็จจึงมีการเปลี่ยนแปลง จนกว่าคำถามที่อ้างอิงจะได้รับคำตอบใน CMake ใหม่ ฉันไม่ต้องการทำให้มันซ้ำกัน น่าเสียดายที่ฉันไม่รู้จัก CUDA มากนัก ดังนั้นจึงไม่สามารถเตรียมคำตอบนั้นได้   -  person Tsyvarev    schedule 11.04.2018
comment
@Tsyvarev ขอบคุณสำหรับคำแนะนำ ฉันได้ลอง enable_language(CUDA) ในโครงการของฉันแล้ว อย่างไรก็ตาม ฉันยังคงแนะนำให้ใช้ฟังก์ชัน/ตัวแปรซีรีส์ find_package(CUDA) เนื่องจากดูเหมือนว่าจะยากที่จะค้นหาเอกสารใด ๆ เกี่ยวกับวิธีลิงก์/รวมไลบรารี/ส่วนหัว cuda อื่น ๆ เช่น npp, curand เป็นต้น   -  person halfelf    schedule 11.04.2018
comment
บล็อกนักพัฒนาของ Nvidia มีคำอธิบายที่ดีเกี่ยวกับการทำเช่นนี้กับ CMake 3.8+: devblogs.nvidia com/building-cuda-applications-cmake   -  person gflegar    schedule 11.04.2018
comment
@halfelf คุณหมายถึงอะไรโดยไลบรารี / ส่วนหัวของ cuda ไลบรารีส่วนใหญ่ที่ Nvidia ผลิตนั้นเป็นไลบรารี C หรือ C ++ ซึ่งเรียกเคอร์เนล CUDA ดังนั้นคุณเพียงแค่เชื่อมโยง / รวมพวกมันเหมือนกับไลบรารีอื่น ๆ นี่คือวิธีที่เราทำกับ cuBLAS และ cuSPARSE ในไลบรารีที่ฉันกำลังพัฒนา: github.com/ginkgo-project/ginkgo/blob/develop/gpu/   -  person gflegar    schedule 11.04.2018
comment
โดยชัดแจ้ง สำหรับ NPP ที่คุณพูดถึง ฉันไม่เห็นสิ่งใดในกระบวนการเชื่อมโยงซึ่ง CMake จะไม่จัดการโดยอัตโนมัติ: docs.nvidia.com/cuda/npp/index.html   -  person gflegar    schedule 11.04.2018
comment
@GoranFlegar ขอบคุณสำหรับตัวอย่างและ devblog ฉันหมายถึงเมื่อใช้ find_package(CUDA) ก่อนอื่นฉันไม่ต้องการ CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES สำหรับส่วนหัว และฉันก็ไม่ต้องการ find_library() สำหรับแต่ละ cuda lib ด้วย เนื่องจากพวกมันถูกตั้งค่าเป็นตัวแปร CUDA_xxx_LIBRARY คุณลักษณะใหม่นี้ให้ความรู้สึกซับซ้อนกว่า find_package(cuda) แบบเก่าเล็กน้อยสำหรับฉัน หรือบางทีฉันอาจพลาดไป   -  person halfelf    schedule 11.04.2018
comment
@halfelf คุณไม่จำเป็นต้องใช้ CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES หากคุณกำลังสร้างไฟล์ .cu เฉพาะในกรณีที่คุณเรียก CUDA runtime API จากไฟล์ .c/.cpp นั่นเป็นเรื่องจริงสำหรับไลบรารี พวกเขาไม่ได้กำหนดไว้ล่วงหน้า แต่คุณสามารถสร้างสคริปต์ wrapper เล็กๆ น้อยๆ สำหรับไลบรารีเหล่านั้นได้เสมอ และรวมไว้ในโปรเจ็กต์ทั้งหมดของคุณ   -  person gflegar    schedule 12.04.2018
comment
นอกจากนี้ยังมีข้อเสียของการใช้ FindCUDA: ใน CMake เวอร์ชันก่อนหน้า การสร้างคำสั่งที่ต้องใช้โค้ด CUDA เช่น cuda_add_library น่าเสียดายที่คำสั่งเหล่านี้ไม่สามารถมีส่วนร่วมในข้อกำหนดการใช้งานได้ และดังนั้นจึงอาจล้มเหลวในการใช้แฟล็กหรือคำจำกัดความของคอมไพลเลอร์ที่เผยแพร่ (จาก devblog ที่ฉันเชื่อมโยงด้านบน)   -  person gflegar    schedule 12.04.2018
comment
ฉันตั้งค่าสถานะ nvcc ผิดหรือเปล่า...การตั้งค่าโปรเจ็กต์พยายามคอมไพล์ด้วย compute_20,sm_20 เสมอ   -  person Dominik    schedule 12.04.2018
comment
@Dominik คุณใช้แพ็คเกจ findCUDA ที่เลิกใช้แล้วหรือการสนับสนุนในตัวหรือไม่ CUDA_NVCC_FLAGS เป็นตัวแปรที่ใช้โดย findCUDA ส่วนรองรับ CUDA ในตัวใช้ CMAKE_CUDA_FLAGS แทน ใช่ การมีสองตัวเลือกนั้นน่าสับสนมาก ดังนั้นคุณต้องระมัดระวังในสิ่งที่คุณทำอยู่   -  person gflegar    schedule 14.04.2018


คำตอบ (1)


ฉันจะพยายามตอบคำถามนี้โดยใช้การสนทนาจากความคิดเห็นและเพิ่มข้อมูลเพิ่มเติม

ก่อนอื่น มีสองวิธีในการเปิดใช้งานการสนับสนุน CUDA ใน CMake อันหนึ่งคือ FindCUDA module แบบเก่า และอีกอันคือโมดูลที่สร้างขึ้นใหม่ เพิ่มการรองรับภาษา CUDA ใน CMake 3.8 และอธิบายที่นี่ คุณสามารถเลือกอย่างใดอย่างหนึ่ง (แต่คุณอาจต้องการใช้การสนับสนุนในตัวสำหรับโปรเจ็กต์ใหม่) แต่คุณต้องยึดติดกับตัวเลือกของคุณ

หากต้องการใช้การสนับสนุนในตัว ให้เพิ่มลงในคำสั่ง project(...) หรือใช้:

enable_language(CUDA);

หากต้องการใช้แพ็คเกจ FindCUDA เก่า คุณจะต้องใช้:

find_package(CUDA);

โปรดทราบว่าทั้งสองตัวเลือกใช้ตัวแปรที่แตกต่างกันโดยสิ้นเชิงในการตั้งค่า หากต้องการดูว่า FindCUDA รองรับตัวแปรใดบ้าง โปรดดูหน้านี้ และสำหรับบิวด์ -ในการสนับสนุน CUDA โปรดดูสิ่งนี้ (อย่าลืมว่าตัวยึดตำแหน่ง <LANG> สามารถแทนที่ด้วยภาษาใดก็ได้ ซึ่งหมายความว่า CUDA ก็เป็นหนึ่งในการแทนที่ที่มีอยู่ด้วย)

เช่น. ด้วย FindCUDA คุณจะใช้ CUDA_NVCC_FLAGS เพื่อตั้งค่าสถานะคอมไพเลอร์ด้วยตนเอง และด้วยการรองรับภาษาในตัว คุณจะใช้ CMAKE_CUDA_FLAGS เพื่อจุดประสงค์เดียวกัน โดยทั่วไป: หากตัวแปรขึ้นต้นด้วย CUDA_ ตัวแปรนั้นจะเป็นส่วนหนึ่งของแพ็คเกจ FindCUDA และหากขึ้นต้นด้วย CMAKE_ แสดงว่าตัวแปรนั้นเป็นส่วนหนึ่งของการสนับสนุนในตัว

person gflegar    schedule 14.04.2018
comment
อย่างไรก็ตาม สำหรับโปรเจ็กต์ของฉันที่ใช้ cuda_gl_interop.h และ cuda_runtime_api เพียงแค่เพิ่ม project(... CUDA) ก็ทำให้เกิดข้อผิดพลาดของลิงเกอร์ โดยบ่นว่า ` อ้างอิงถึง cudaSetDevice' ที่ไม่ได้กำหนดไว้ เป็นต้น ดังนั้นฉันจึงหันไปใช้ find_paclage(CUDA) และ cuda_add_executable และมันก็เชื่อมโยงได้ดี - person yuqli; 31.07.2020