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
注意,如果之前是非同步啟動,該函式可能返回錯誤碼。