2010-09-28 5 views
6

¿Hay alguna manera de que pueda llamar CUDA tiempo de ejecución llamadas a funciones tales como¿Puedo llamar a la función de tiempo de ejecución de CUDA desde el código de C++ no compilado por nvcc?

cudaMemcpy(...); 

en un archivo .cpp, compilado con un compilador C++ normal?

+0

¿Por qué no se intenta? :) Y sí, esta función en particular cudaMemcpy() se puede llamar desde un archivo C. Por cierto, encuentro que la documentación de cuda es terrible en ese tipo de detalles. – Slava

+0

Siguiendo con la respuesta de Preet: también necesitarás un enlace contra 'cudart' para satisfacer al enlazador. Es decir. nvcc -lcudart myfile.cpp – Edric

Respuesta

16

EDITAR: Hubo un example here pero ya no se encuentra, pero la mayoría del ejemplo se copió a continuación.

La persona que llama C (pero podría ser C++)

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <cuda.h> 

extern void kernel_wrapper(int *a, int *b); 

int main(int argc, char *argv[]) 
{ 
    int a = 2; 
    int b = 3; 

    kernel_wrapper(&a, &b); 

    return 0; 
} 

El destinatario de la llamada (CUDA)

__global__ void kernel(int *a, int *b) 
{ 
    int tx = threadIdx.x; 

    switch(tx) 
    { 
case 0: 
    *a = *a + 10; 
    break; 
case 1: 
    *b = *b + 3; 
    break; 
default: 
    break; 
    } 
} 

void kernel_wrapper(int *a, int *b) 
{ 
    int *d_1, *d_2; 
    dim3 threads(2, 1); 
    dim3 blocks(1, 1); 

    cudaMalloc((void **)&d_1, sizeof(int)); 
    cudaMalloc((void **)&d_2, sizeof(int)); 

    cudaMemcpy(d_1, a, sizeof(int), cudaMemcpyHostToDevice); 
    cudaMemcpy(d_2, b, sizeof(int), cudaMemcpyHostToDevice); 

    kernel<<< blocks, threads >>>(a, b); 

    cudaMemcpy(a, d_1, sizeof(int), cudaMemcpyDeviceToHost); 
    cudaMemcpy(b, d_2, sizeof(int), cudaMemcpyDeviceToHost); 

    cudaFree(d_1); 
    cudaFree(d_2); 
} 
+0

El enlace está roto. –

+1

en una nota lateral: Cuda no recomienda subprocesos divergentes como lo está haciendo en la función de kernel que proporcionó. –

+0

No dude en editar la respuesta para mejorarla. –

Cuestiones relacionadas