Frage

Ich bin tryint CUDA in einem bestehenden Projekt zu integrieren, in denen mehrere Bibliotheken (DLLs) erstellt werden. Ich begann mit einem sehr einfachen Kern, der ein Punktprodukt berechnet:

// dotProd_kernel.cu

__global__ void dotProd( double* result, double* vec1, double* vec2)
{
    int i = threadIdx.x;
 result[i] = vec1[i] * vec2[i];
}

Dieser Kernel von einem Host-Skript aufgerufen wird:

// doProd.cu

#include <cutil_inline.h>
#include <dotProd_kernel.cu>

extern "C" double CUDA_dot(THTensor *vec1, THTensor *vec2);

double CUDA_dot(THTensor *vec1, THTensor *vec2)
{
    // [content skipped]    

    // execute the kernel
    dotProd<<< 1, nbThreads >>>(device_vec1, device_vec2, device_result_array);

    // [content skipped]

    return sum;
}

erzeugen I-Dateien erstellen Cmake verwenden und verwenden Visual Studio 2008 Pro es zu kompilieren. Wenn ich einfach eine .cu-Datei mit einer foobar Funktion verwenden, die keinen Kern nennen, führt es in Ordnung. Aber mit dem obigen Code, erhalte ich folgende Fehlermeldung:

c:\cuda\include\math_functions.h(3459) : error C2491: 'log1p' : definition of dllimport function not allowed

Der resultierende Code, der die CUDA-Code ruft als DLL exportiert. Ist das das Problem?

War es hilfreich?

Lösung 3

Tatsächlich definiert die CUDA-Bibliothek die log1p Funktion, und so war ein dunkler Teil des Codes Ich versuche CUDA hinzuzufügen. So war es eine Art von Konflikt zwischen den beiden. Ich umbenannt einfach die Funktion in meinem Code, und es hat funktioniert!

Andere Tipps

Ich weiß nicht einmal, was CUDA ist, aber ich würde den Code sehen, der den Compiler-Fehler hatte (math_functions.h) und Blick auf Linie 3459 und sehe, was es versucht, von dort zu tun und zu starten. Es scheint nichts zu tun, was Sie versuchen den Code zu tun, Sie auf dem Laufenden.

übrigens, wenn Sie mit CUDA 2.3 (oder, bevorzugt 3,0), dann sollten Sie in der Lage sein, um loszuwerden, der extern „C“.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top