Я новичок в использовании OpenCL (с библиотекой OpenCL.NET) с Visual Studio C# и в настоящее время работаю над приложением, которое вычисляет большую трехмерную матрицу. На каждом пикселе в матрице вычисляются 192 уникальных значения, а затем суммируются, чтобы получить окончательное значение для этого пикселя. Таким образом, функционально, это как матрицу 4-D (161 х 161 х 161) х 192.Использование локальных рабочих в OpenCL для вычисления больших матриц
Сейчас я звоню ядро из моего кода хозяина, как это:
//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);
Sample Код ядра приведен ниже.
__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?)
Спасибо за помощь!
ли значение в BigMatrix вычисленное против любых других значений в BigMatrix? Как используется «p» в расчете? Можете ли вы дать больше информации о вычислении, которое вы пытаетесь сделать? – mfa
Несомненно. Значения BigMatrix не используются в расчете, а только индексы. Значения BigMatrix изначально равны 0 и устанавливаются на результат вычисления. В расчет используются индексы текущего пикселя в BigMatrix (p.x, p.y, p.z), чтобы найти вектор в другой точке, заданной значением в otherArray. Поэтому каждый расчет уникален, так как каждый пиксель имеет уникальный вектор для каждого из 192 точек в otherArray. Величина и расстояние этого вектора используются в окончательном вычислении для конечного значения в BigMatrix. – superwillis