Domanda

Sono tryint a integrare CUDA in un progetto esistente, in cui vengono create diverse librerie (DLL). Ho iniziato con un semplice kernel che calcola un prodotto scalare:

// dotProd_kernel.cu

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

Questo kernel viene chiamato da uno script host:

// 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;
}

I generare costruire file utilizzando CMake, e utilizzare Visual Studio 2008 Pro per compilarlo. Se mi è sufficiente utilizzare un file di .cu con una funzione foobar che chiama nessun kernel, viene eseguito bene. Ma con il codice di cui sopra, ottengo il seguente errore:

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

Il codice risultante che chiama il codice CUDA viene esportato come una DLL. E 'questo il problema?

È stato utile?

Soluzione 3

In realtà, la libreria CUDA definisce la funzione log1p, e così è stato una parte oscura del codice che sto cercando di aggiungere CUDA per. Quindi, ci fu una sorta di conflitto tra i due. Ho rinominato semplicemente la funzione nel mio codice, e ha funzionato!

Altri suggerimenti

Io non so nemmeno cosa CUDA è, ma vorrei guardare il codice che ha avuto l'errore del compilatore (math_functions.h) e guardare la linea 3459 e vedere che cosa sta cercando di fare e cominciare da lì. Sembra estranei a ciò che si sta cercando di fare nel codice che avete inviato.

Per inciso, se si sta utilizzando CUDA 2.3 (o, preferibilmente 3.0) allora si dovrebbe essere in grado di sbarazzarsi del extern "C".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top