2010-09-28 13 views
6

Ben işlevi çağırır CUDA çalışma zamanı diyoruz herhangi bir yolu var mı böyle düzenli bir C++ derleyicisi ile derlenir .cpp dosyasında CUDA çalışma zamanı işlevini, nvcc tarafından derlenmeyen C++ kodundan arayabilir miyim?

cudaMemcpy(...); 

gibi?

+0

Neden sadece denemiyorsun? :) Ve evet, bu özel işlev cudaMemcpy() bir C dosyasından çağrılabilir. Bu arada, cuda belgelerini bu tür ayrıntılarda korkunç buluyorum. – Slava

+0

Preet'in cevabından sonra: linker'ı tatmin etmek için 'cudart' ile de bağlantı kurmanız gerekecek. Yani nvcc -lcudart myfile.cpp – Edric

cevap

16

DÜZENLEME: example here vardı, ancak daha uzun bulunamadı, ancak çoğu örnek kopyalandı.

Arayan C (ancak ++ C olabilir)

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

Callee (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

Bağlantı bozuk. Bir yan notta –

+1

- Cuda, sağladığınız çekirdek işlevinde yaptığınız gibi farklı konuları önermez. –

+0

Lütfen daha iyi hale getirmek için cevabı düzenlemek için çekinmeyin. –

İlgili konular