私は Visual Studio C# で OpenCL (OpenCL.NET ライブラリを使用) を使用する初心者で、現在、大規模な 3D 行列を計算するアプリケーションに取り組んでいます。マトリックス内の各ピクセルで、192 の一意の値が計算され、合計されて、そのピクセルの最終的な値が得られます。したがって、機能的には、(161 x 161 x 161) x 192 の 4 次元行列のようなものです。
現在、次のようにホスト コードからカーネルを呼び出しています。
//C# host code
...
float[] BigMatrix = new float[161*161*161]; //1-D result array
CLCalc.Program.Variable dev_BigMatrix = new CLCalc.Program.Variable(BigMatrix);
CLCalc.Program.Variable dev_OtherArray = new CLCalc.Program.Variable(otherArray);
//...load some other variables here too.
CLCalc.Program.Variable[] args = new CLCalc.Program.Variable[7] {//stuff...}
//Here, I execute the kernel, with a 2-dimensional worker pool:
BigMatrixCalc.Execute(args, new int[2]{N*N*N,192});
dev_BigMatrix.ReadFromDeviceTo(BigMatrix);
サンプルのカーネル コードは以下に掲載されています。
__kernel void MyKernel(
__global float * BigMatrix
__global float * otherArray
//various other variables...
)
{
int N = 161; //Size of matrix edges
int pixel_id = get_global_id(0); //The location of the pixel in the 1D array
int array_id = get_global_id(1); //The location within the otherArray
//Finding the x,y,z values of the pixel_id.
float3 p;
p.x = pixel_id % N;
p.y = ((pixel_id % (N*N))-p.x)/N;
p.z = (pixel_id - p.x - p.y*N)/(N*N);
float result;
//...
//Some long calculation for 'result' involving otherArray and p...
//...
BigMatrix[pixel_id] += result;
}
私のコードは現在動作していますが、このアプリケーションの速度を探していて、ワーカー/グループのセットアップが最適なアプローチであるかどうかはわかりません (つまり、ワーカー プールのサイズは 161*161*161 と 192 です)。
効率を高めるために、グローバル ワーカー プールをローカル ワーカー グループに編成する他の例を見てきましたが、それを OpenCL.NET に実装する方法がよくわかりません。また、これがワーカー プールに別のディメンションを作成することとどのように違うのかわかりません。
私の質問は、ここでローカル グループを使用できますか。一般に、ローカル グループを使用することは、単に n 次元のワーカー プールを呼び出すこととどう違うのでしょうか? (つまり、Execute(args, new int[]{(N*N*N),192}) を呼び出すのに対し、ローカル ワークグループのサイズは 192 ですか?)
助けてくれてありがとう!