Verwenden Sie cmake, um das cuda-Projekt für vs2013 zu konfigurieren und den Fehler "Ungültige Gerätefunktion" zu erhalten.
Ich verwende das cmake gui-Tool, um mein cuda-Projekt in vs2013 zu konfigurieren. CMakeLists.txt ist wie folgt:
project(CUDA_PART)
# required cmake version
cmake_minimum_required(VERSION 3.0)
include_directories(${CUDA_PART_SOURCE_DIR}/common)
# packages
find_package(CUDA REQUIRED)
# nvcc flags
set(CUDA_NVCC_FLAGS -gencode arch=compute_20,code=sm_20;-G;-g)
set(CUDA_VERBOSE_BUILD ON)
#FILE(GLOB SOURCES "*.cu" "*.cpp" "*.c" "*.h")
CUDA_ADD_EXECUTABLE(CUDA_PART hist_gpu_shmem_atomics.cu)
Die .cu-Datei stammt vonCuda am Beispiel Quellcode hist_gpu_shmem_atomics.cu
Es gibt zwei Probleme:
Nach der Zeilehisto_kernel <<<blocks * 2, 256 >>>(dev_buffer, SIZE, dev_histo);
Es tritt ein Fehler "Ungültige Gerätefunktion" auf.
Wenn ich das CUDA-Debugging-Tool zum Debuggen verwende, können keine Haltepunkte im Gerätecode ausgelöst werden.
Aber wenn ich ein Projekt mit dem gleichen Code vom cuda Projekttempel in Visual Studio 2013 erstelle. Es funktioniert korrekt!
Also, stimmt etwas in der CMakeLists.txt nicht?
OS: Win7 64bit; GPU: GTX960; CUDA: CUDA 7.5; VS: 2013 (und auch 2010)
Wenn ich benutze, setze die "Code Generation" in vs2013 wie folgt:
Die CUDA_NVCC_FLAGES entpuppt sich als-gencode=arch=compute_20,code=\"sm_20,compute_20\"
Es entspricht:
-gencode=arch=compute_20,code=sm_20 \
-gencode=arch=compute_20,code=compute_20
Also, ich denke, es werden 2 Versionen des Maschinencodes generiert: der erste (SASS) mit virtuellen und realen Architekturen und der zweite (PTX) mit nur virtueller Architektur. Da meine GTX960 ein cc5.2-Gerät ist, wählt sie das zweite (PTX) und konvertiert es in ein geeignetes SASS.