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

注意,如果之前是異步啓動,該函數可能返回錯誤碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章