1. 程式人生 > >CPU與GPU之間資料傳輸(轉)

CPU與GPU之間資料傳輸(轉)

一般的資料複製到的顯示卡記憶體的部份,稱為 global memory

int* gpudata, *result;
    cudaMalloc((void**) &gpudata, sizeof(int) * DATA_SIZE);
    cudaMalloc((void**) &result, sizeof(int));
    cudaMemcpy(gpudata, data, sizeof(int) * DATA_SIZE,
        cudaMemcpyHostToDevice);

int sum;
    cudaMemcpy(&sum, result, sizeof(int), cudaMemcpyDeviceToHost);
    cudaFree(gpudata);
    cudaFree(result);

關鍵函式說明:1.5.1 cudaMalloc

名稱

cudaMalloc – 在GPU上分配儲存器

概要

cudaError_t cudaMalloc( void** devPtr,size_t count )

說明

向裝置分配 count 位元組的線性儲存器,並以*devPtr的形式返回指向所分配儲存器的指標。可針對任何型別的變數合理調整所分配的儲存器。儲存器不會被清除。如果出現錯誤,cudaMalloc()將返回cudaErrorMemoryAllocation。

返回值

相關返回值:

cudaSuccess cudaErrorMemoryAllocation

注意,如果之前是非同步啟動,該函式可能返回錯誤碼。

1.1.1   1.5.10 cudaMemcpy

名稱

cudaMemcpy – 在GPU和主機之間複製資料

概要

cudaError_t cudaMemcpy( void* dst,const void* src,size_t count,enum cudaMemcpyKind kind )

cudaError_t cudaMemcpyAsync( void* dst,const void* src,size_t count,enum cudaMemcpyKind

kind,cudaStream_t stream )

說明

從src指向的儲存器區域中將count個位元組複製到dst指向的儲存器區域,其中kind是cudaMemcpyHostToHost、cudaMemcpyHostToDevice、cudaMemcpyDeviceToHost或cudaMemcpyDeviceToDevice之一,用於指定複製的方向。儲存器區域不可重疊。呼叫cudaMemcpy()時,如果dst和src指標與複製的方向不匹配,則將導致不確定的行為。

cudaMemcpyAsync()是非同步的,可選擇傳入非零流引數,從而將其關聯到一個流。它僅對分頁鎖定的主儲存器有效,如果傳入指向可分頁儲存器的指標,那麼將返回一個錯誤。

返回值

相關返回值:

cudaSuccess

cudaErrorInvalidValue

cudaErrorInvalidDevicePointer cudaErrorInvalidMemcpyDirection

注意,如果之前是非同步啟動,該函式可能返回錯誤碼。

1.1.2   1.5.3 cudaFree

名稱

cudaFree – 釋放GPU上的儲存器

概要

cudaError_t cudaFree (void* devPtr)

說明

釋放devPtr(必須在之前呼叫cudaMalloc()或cudaMallocPitch()時返回)指向的儲存器空間。如果未返回或者之前已經呼叫過cudaFree(devPtr),則返回一個錯誤。如果devPtr為0,則不執行任何操作。如果出現錯誤,cudaFree()將返回cudaErrorInvalid-DevicePointer。

返回值

相關返回值:

cudaSuccess

cudaErrorInvalidDevicePointer cudaErrorInitializationError

注意,如果之前是非同步啟動,該函式可能返回錯誤碼。