2017-02-18 8 views
2

Ich benutze CUDA Toolkit 8 mit Visual Studio Community 2015. Wenn ich versuche, einfache Vektor-Zugabe von NVidia PDF-Handbuch (minus Fehlerprüfung, für die ich nicht die * .hs), kommt es immer zurück als undefinierte Werte, was bedeutet, dass das Ausgabe-Array nie gefüllt wurde. Wenn ich es mit Nullen vorfülle, ist das alles, was ich am Ende bekomme.CUDA Kernel gibt nichts zurück

Andere hatten dieses Problem und einige Leute sagen, dass es durch Kompilieren für die falsche Rechenleistung verursacht wurde. Allerdings verwende ich eine NVidia GTX 750 Ti, die Compute Capability 5 sein soll. Ich habe versucht, Compute Capability 2.0 (das Minimum für mein SDK) und 5.0 zu kompilieren.

Ich kann auch keine der vorkompilierten Beispiele funktionieren, wie vectoradd.exe, die besagt, "Fehler beim Zuweisen von Gerätevektor A (Fehlercode Initialisierungsfehler)!" Und oceanfft.exe sagt: "Fehler beim Suchen von GLSL-Vertex- und Fragment-Shadern!" Das macht keinen Sinn, da GLSL und Fragment Shading sehr grundlegende Funktionen sind.

Meine Treiberversion ist 361.43 und andere Anwendungen wie Blender Cycles im CUDA-Modus und Stellarium arbeiten perfekt. Hier

ist der Code, sollte Arbeit:

#include "cuda_runtime.h" 
#include "device_launch_parameters.h" 

#include <stdio.h> 
#include <iostream> 
#include <algorithm> 
#define N 10 

__global__ void add(int *a, int *b, int *c) { 
    int tid = blockIdx.x; // handle the data at this index 
    if (tid < N) 
     c[tid] = a[tid] + b[tid]; 
} 

int main(void) { 
    int a[N], b[N], c[N]; 
    int *dev_a, *dev_b, *dev_c; 
    // allocate the memory on the GPU 
    cudaMalloc((void**)&dev_a, N * sizeof(int)); 
    cudaMalloc((void**)&dev_b, N * sizeof(int)); 
    cudaMalloc((void**)&dev_c, N * sizeof(int)); 
    // fill the arrays 'a' and 'b' on the CPU 
    for (int i = 0; i<N; i++) { 
     a[i] = -i; 
     b[i] = i * i; 
    } 
    // copy the arrays 'a' and 'b' to the GPU 
    cudaMemcpy(dev_a, a, N * sizeof(int),cudaMemcpyHostToDevice); 
    cudaMemcpy(dev_b, b, N * sizeof(int),cudaMemcpyHostToDevice); 
    add << <N, 1 >> >(dev_a, dev_b, dev_c); 
    // copy the array 'c' back from the GPU to the CPU 
    cudaMemcpy(c, dev_c, N * sizeof(int),cudaMemcpyDeviceToHost); 
    // display the results 
    for (int i = 0; i<N; i++) { 
     printf("%d + %d = %d\n", a[i], b[i], c[i]); 
    } 
    // free the memory allocated on the GPU 
    cudaFree(dev_a); 
    cudaFree(dev_b); 
    cudaFree(dev_c); 
    return 0; 
} 

Ich versuche CUDA zu entwickeln apps so wäre jede Hilfe sehr geschätzt.

+0

Kann bestätigen Code arbeiten. – Mikhail

+1

Ihre CUDA-Installation scheint unterbrochen zu sein. 361.43 ist nicht der Treiber, der mit dem CUDA 8-Windows-Installationsprogramm ausgeliefert wird, und Sie sollten diesen Treiber wahrscheinlich verwenden, bis Sie ein Betriebssystem erhalten. Mein Vorschlag wäre, [das neueste Installationsprogramm herunterzuladen] (https://developer.nvidia.com/cuda-downloads), und CUDA 8 neu zu installieren, wobei die Anweisungen im [Windows CUDA install guide] (http: // docs .nvidia.com/cuda/cuda-installationsanleitung-microsoft-windows/index.html # abstract). –

+0

Okay, ich lade jetzt das neueste CUDA 8.0.61 Toolkit herunter und probiere es aus und wähle die Treiberinstallation. Ich hatte bereits einen Bildschirmtreiber, und ich muss den Treiber des Toolkits übersprungen haben, da ich keine Notwendigkeit sah, über meinen aktuellen Treiber zu installieren. –

Antwort

1

Dies wurde anscheinend verursacht, indem eine inkompatible Treiberversion mit dem CUDA 8-Toolkit verwendet wurde. Die Installation des Treibers, der mit dem Toolkit der Version 8 ausgeliefert wurde, löste das Problem.

[Antwort von Kommentaren zusammengestellt und als Community Wiki-Eintrag hinzugefügt, um die Frage von der unbeantworteten Warteschlange für den CUDA-Tag zu bekommen] sollte