ビデオ フレーム データに対して何らかの処理を実行するアプリケーションを開発しています。それを高速化するために、2 枚のグラフィック カードを使用し、OpenCL でデータを処理します。私の考えは、1 つのフレームを最初のカードに送信し、別のフレームを 2 番目のカードに送信することです。デバイスは同じコンテキストを使用しますが、異なるコマンド キュー、カーネル、およびメモリ オブジェクトを使用します。
ただし、2枚のカードで必要な時間は1枚のグラフィックカードで必要な時間とほぼ同じであるため、計算は並行して実行されないように思えます。
独立したデータに対して複数のデバイスを同時に使用する良い例はありますか?
前もって感謝します。
編集:
2 つの別々のコンテキストに切り替えた後の結果のコードを次に示します。ただし、グラフィック カードが 2 枚の場合の実行時間は、グラフィック カードが 1 枚の場合と同じままです。
cl::NDRange globalws(imageSize);
cl::NDRange localws;
for (int i = 0; i < numDevices; i++){
// Copy the input data to the device
commandQueues[i].enqueueWriteBuffer(inputDataBuffer[i], CL_TRUE, 0, imageSize*sizeof(float), wt[i].data);
// Set kernel arguments
kernel[i].setArg(0, inputDataBuffer[i]);
kernel[i].setArg(1, modulusBuffer[i]);
kernel[i].setArg(2, imagewidth);
}
for (int i = 0; i < numDevices; i++){
// Run kernel
commandQueues[i].enqueueNDRangeKernel(kernel[i], cl::NullRange, globalws, localws);
}
for (int i = 0; i < numDevices; i++){
// Read the modulus back to the host
float* modulus = new float[imageSize/4];
commandQueues[i].enqueueReadBuffer(modulusBuffer[i], CL_TRUE, 0, imageSize/4*sizeof(float), modulus);
// Do something with the modulus;
}