2010-11-23 6 views
1

Hey da ... also ich bin hier mit VS2008, Programmierung mit CUDA C. Ich habe das 3.2 Toolkit installiert und funktioniert.Probleme mit Strukturen, CUDA C/C++ und VS 2008

Nun mein Problem ist, ich habe eine Datei mit diesem:

#ifndef _cuda_rng_cu_included_ 
#define _cuda_rng_cu_included_ 

#include <stdio.h> 


static void HandleError(cudaError_t err, 
         const char *file, 
         int line) { 
    if (err != cudaSuccess) { 
     printf("%s in %s at line %d\n", cudaGetErrorString(err), 
       file, line); 
     exit(EXIT_FAILURE); 
    } 
} 
#define HANDLE_ERROR(err) (HandleError(err, __FILE__, __LINE__)) 

//some other struct 

ich aus dem Buch von Beispiel CUDA diesen Code erhalten, so ist es .. arbeiten sollte, aber wenn ich bauen getroffen bekomme ich diesen Fehler (die erste):

error C2065: 'cudaError_t' : undeclared identifier

und dann ein Tsunami von Fehlern angehängt, wie uint2 Typ nicht gefunden werden und Variablen nicht deklariert werden.

Was könnte das Problem sein? cudaError_t ist in $ (CUDA_PATH_V3_2) \ include definiert und dieser Pfad befindet sich in meinem erforderlichen Include-Verzeichnis.

Die Datei Eigenschaft wird festgelegt, wie zu: Tool: CUDA Runtime API

ich das #ifndef setzen, weil ich nicht herausgefunden habe, wie man mit dem Linker zwischen normalen C++ arbeiten und CUDA C. Wie, wenn ich eine Struktur mit den beiden habe CUDA C (__global__ und ` __device__) und einige normale Methoden. Wenn ich diese Datei .cu benenne, wird im normalen C++ - Code, der diese Struktur verwendet, ein Fehler ausgegeben, der besagt, dass er nicht deklariert wurde.

Ich habe versucht, manuell driver_types.h und Tonnen anderer Header, aber keine von ihnen werden vom Compiler gefunden.

Sorry, wenn ich nicht klar war, bin ich müde.

Antwort

3

Dateien mit der Erweiterung .cu werden von nvcc behandelt, die automatisch die CUDA-spezifischen Header enthält, so dass die CUDA-Typen deklariert werden. Wenn Sie es .c/ nennen, müssen Sie die entsprechende Kopfzeile einschließen, um die Typen zu erhalten. Da Sie die Laufzeit-API verwenden, versuchen Sie es mit cuda_runtime_api.h.

Die Tatsache, dass Sie sie nicht finden, deutet darauf hin, dass Ihre Pfade nicht korrekt eingestellt wurden. Versuchen Sie, $ (CUDA_PATH) \ include zu den Include-Pfaden hinzuzufügen (siehe this post für weitere Details).

Having said that, gibt es hier Bedenken ...

Sie brauchen nicht eine Struktur (oder eine Klasse) als __global__ oder __device__, die Struktur ist nur eine Art und der Typ zu deklarieren Cross- Plattform. Wo diese Deklarationen benötigt werden, ist die Speicherposition, d. H. Wenn Sie eine Instanz der Struktur erstellen oder wo Sie Code erstellen, der für das Gerät kompiliert werden muss.

Wenn Sie einfach eine Struktur erklären, dann sollten Sie in der Lage sein, es in einer Header-Datei zu deklarieren und es in beiden .cpp und .cu Dateien ohne Probleme, und wenn nicht, dann mit allen Mitteln eine separate Frage mit mehr Details veröffentlichen .

+0

Ich habe diesen Beitrag einmal gesehen, und ich habe vergessen, es in diesem neuen Projekt zu tun. Aber es funktioniert immer noch nicht. Ich kann jetzt cuda.h, cuda_runtime.h und andere einschließen, und dieser nicht deklarierte Bezeichner verschwindet. Aber jetzt bekomme ich einen weiteren Fehler: ''threadIdx': undeclared identifier'. Gottverdammt..fühlt sich an, als ob ich das unter Linux tun sollte ... – hfingler

+0

Was ist die Erklärung der Funktion, wo Sie den Fehler bezüglich threadIdx bekommen? Es sollte als global deklariert werden. – user434507

+0

@ user434507, ist es in einer '__device__' Funktion. Es sollte funktionieren, ich habe diesen Code von einer Website, er generiert Zufallszahlen auf dem Gerät, es heißt Rand48. Ich habe es von hier: 'http: //forums.nvidia.com/index.php?showtopic= 64545' – hfingler

0

Haben Sie die Include-Pfade richtig eingestellt? Das würde erklären, warum der Compiler die Include-Dateien nicht findet.