2010-09-28 38 views
6

Có cách nào tôi có thể gọi CUDA runtime gọi hàm nhưTôi có thể gọi hàm thời gian chạy CUDA từ mã C++ không được biên dịch bởi nvcc không?

cudaMemcpy(...); 

trong một file cpp, biên soạn với một ++ biên dịch C thường xuyên?

+0

Tại sao bạn không chỉ cần thử? :) Và có, chức năng cụ thể này cudaMemcpy() có thể được gọi từ một tập tin C. Bằng cách này tôi tìm thấy tài liệu cuda khủng khiếp trong đó loại chi tiết. – Slava

+0

Theo sau từ câu trả lời của Preet: bạn cũng sẽ cần phải liên kết với 'cudart' để thỏa mãn mối liên kết. I E. nvcc -lcudart myfile.cpp – Edric

Trả lời

16

CHỈNH SỬA: Có một số example here nhưng không tìm thấy nữa, nhưng hầu hết ví dụ được sao chép bên dưới.

Người gọi C (nhưng có thể là 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; 
} 

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

Liên kết bị hỏng. –

+1

trên một mặt lưu ý - Cuda không khuyên bạn nên phân tách các chủ đề như bạn đang làm trong chức năng hạt nhân mà bạn cung cấp. –

+0

Vui lòng chỉnh sửa câu trả lời để cải thiện câu trả lời. –

Các vấn đề liên quan