使用CUDA 5與VS 2012和功能3.5(Titan和K20)。從設備寫入主機並通知主機
在內核執行的特定階段,我想將生成的數據塊發送到主機內存,並通知主機數據已準備就緒,因此主機將對其進行操作。
我不能等到內核執行結束讀取數據從設備背面,因爲:
- 一旦計算出的數據不再與設備相關的,所以沒有點保持最後。
- 數據大小太大而無法放在設備內存上,並等到結束。
- 主機不應該等到內核執行結束纔開始處理數據。
你能指出我我必須採取的路徑和可能的CUDA概念和功能,我必須使用達到我的要求?簡而言之,如何寫入主機並通知主機塊數據已準備好進行主機處理?
N.B.每個線程不會與任何其他線程共享任何生成的數據,它們將獨立運行。所以,據我所知(如果我錯了,請糾正我),塊,線和經紗的概念不會影響問題。換句話說,如果他們幫助答案,我可以自由改變他們的組合。
下面是一個示例代碼,顯示我試圖做的事:
#pragma once
#include <conio.h>
#include <cstdio>
#include <cuda_runtime_api.h>
__global__ void Kernel(size_t length, float* hResult)
{
int tid = threadIdx.x + blockIdx.x * blockDim.x;
// Processing multiple data chunks
for(int i = 0;i < length;i++)
{
// Once this is assigned, I don't need it on the device anymore.
hResult[i + (tid * length)] = i * 100;
}
}
void main()
{
size_t length = 10;
size_t threads = 2;
float* hResult;
// An array that will hold all data from all threads
cudaMallocHost((void**)&hResult, threads * length * sizeof(float));
Kernel<<<threads,1>>>(length, hResult);
// I DO NOT want to wait to the end and block to get the data
cudaError_t error = cudaDeviceSynchronize();
if (error != cudaSuccess) { throw error; }
for(int i = 0;i < threads * length;i++)
{
printf("%f\n", hResult[i]);;
}
cudaFreeHost(hResult);
system("pause");
}
如何以及何時生成數據塊?兩個塊是否會生成一個塊?還是每個塊都由來自所有塊的數據組成,在塊執行期間的不同時間寫入?在後一種情況下,您需要知道數據的生成遍佈整個內核運行時。 – tera 2013-05-06 10:00:36
我更新了我的問題以反映您的問題的答案。 – Adam 2013-05-06 13:24:50