VS 2012 および機能 3.5 (Titan および K20) で CUDA 5 を使用する。
カーネル実行の特定の段階で、生成されたデータ チャンクをホスト メモリに送信し、データの準備ができていることをホストに通知して、ホストがデータを処理できるようにしたいと考えています。
次の理由により、カーネルの実行が終了するまでデバイスからデータを読み取ることができません。
- データは、計算されるとデバイスに関係しなくなるため、最後まで保持しても意味がありません。
- データ サイズが大きすぎてデバイス メモリに収まらず、最後まで待機します。
- ホストは、データの処理を開始するために、カーネルの実行が終了するまで待つ必要はありません。
私がたどらなければならない道と、私の要件を達成するために使用しなければならない可能性のあるcudaの概念と機能を教えてもらえますか? 簡単に言えば、どうすればホストに書き込み、チャンク データがホスト処理の準備ができていることをホストに通知できますか?
注: 各スレッドは、生成されたデータを他のスレッドと共有せず、独立して実行されます。したがって、私の知る限り (間違っている場合は訂正してください)、ブロック、スレッド、およびワープの概念は質問に影響しません。言い換えれば、それらが答えに役立つ場合、私はそれらの組み合わせを自由に変更できます。
以下は、私がやろうとしていることを示すサンプルコードです:
#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");
}