2016-09-20 2 views
-1

Ich habe versucht, eine ausführbare Datei auszuführen, die eine trennbare Kompilierung auf einer GTX 1080 verwendet (Compute Capability 6.1, die nicht direkt von CUDA 7.5 unterstützt wird) und konnte sie nicht ausführen. wenn der erste CUDA-Aufruf fehlschlägt. Ich habe es bis auf cublas verfolgt, wie dieses einfache Programm (das auch nicht cublas verwenden)CUDA-Code schlägt auf Pascal-Karten fehl (GTX 1080)

#include <cuda_runtime_api.h> 
#include <cstdio> 

__global__ void foo() 
{ 
} 

int main(int, char**) 
{ 
    void * data = nullptr; 
    auto err = cudaMalloc(&data, 256); 
    printf("%s\n", cudaGetErrorString(err)); 
    return 0; 
} 

versagt (Ausgänge „unbekannten Fehler“) gebaut, wenn

nvcc -dc --gpu-architecture=compute_52 -m64 main.cu -o main.dc.obj 
nvcc -dlink --gpu-architecture=compute_52 -m64 -lcublas_device main.dc.obj -o main.obj 
link /SUBSYSTEM:CONSOLE /LIBPATH:"%CUDA_PATH%\lib\x64" main.obj main.dc.obj cudart_static.lib cudadevrt.lib cublas_device.lib 

und arbeitet mit (Ausgängen „kein Fehler“), wenn gebaut mit

nvcc -dc --gpu-architecture=compute_52 -m64 main.cu -o main.dc.obj 
nvcc -dlink --gpu-architecture=compute_52 -m64 main.dc.obj -o main.obj 
link /SUBSYSTEM:CONSOLE /LIBPATH:"%CUDA_PATH%\lib\x64" main.obj main.dc.obj cudart_static.lib cudadevrt.lib 

Selbst gebaut, wenn der CUDA 8 Release Candidate verwenden und compute_61 stattdessen es immer noch nicht so lange, wie cublas_device.lib verbunden ist.

+0

Ich verstehe nicht, wie sich Ihr Update auf Ihre Frage bezieht. Und ich glaube nicht, dass Ihre Interpretation von dem, was geschieht, richtig ist. Es ist nicht so, dass es keine PTX gibt, es ist, dass 'cuobjdump' nichts in der Ausgabe einer Geräteverknüpfungsdatei findet, die es zu zerlegen versteht. – talonmies

+0

@talonmies Ich habe die Frage umgeschrieben, da die Änderung scheinbar nur dazu diente, zu verwirren, und die ursprüngliche Frage war (wie Sie vermuteten) auf einer falschen Annahme basiert. Obwohl, cuobjdump dump tatsächlich PTX, nicht Demontage. Der JIT-Compiler des Treibers erfordert, dass PTX CUDA-Code auf neueren Architekturen ausführt. – Joe

+1

Die unterstützte Methode zum Erstellen von Codes unter Windows ist die Verwendung von Visual Studio. Mein Vorschlag ist, dass Sie CUDA 8RC verwenden und das Beispielprojekt [simpleDevLibCublas] ausführen (http://docs.nvidia.com/cuda/cuda-samples/index.html#simpledevlibcublas-gpu-device-api-library-functions-- cuda-dynamisch-Parallelismus-). Wenn es in Ihrem Setup ordnungsgemäß ausgeführt wird, dann untersuchen Sie sorgfältig die Kompilierungssequenz, die in VS generiert wird, und duplizieren Sie das. –

Antwort

1

Analyse des simpleDevLibCublas Beispiel zeigt, dass das Beispiel für eine Reihe von realen Architekturen aufgebaut ist (sm_xx) und nicht für virtuelle Architekturen (compute_xx), also das Beispiel in CUDA 7.5 nicht auf neueren Karten laufen. Außerdem enthält das gleiche Beispiel in CUDA 8RC nur eine zusätzliche Architektur, sm_60. Which is only used by the P100. Allerdings läuft dieses Beispiel auch auf 6.1-Karten wie der GTX 1080. Unterstützung für die Architektur sm_61 ist in Cublas nicht enthalten, auch nicht in CUDA 8RC.

Daher arbeitet das Programm, wenn wenn die Verknüpfung cublas_device mit --gpu-architecture=sm_60 selbst gebaut, wird aber nicht Arbeit mit --gpu-architecture=compute_60, --gpu-architecture=sm_61 oder --gpu-architecture=compute_61. Oder irgendeine --gpu-architecture=compute_xx für diese Angelegenheit.