Следующий код извлекает квадратное выделение из массива (image) с плавающей точкой и помещает его в массив с плавающей точкой2. И float2, и исходные массивы являются одномерными массивами, которые представляют последовательные строки в изображении. Исходное значение с плавающей точкой помещается в поле x, а поле y устанавливается в ноль.
Приведенный ниже код не скомпилируется с использованием Hybridizer, и я понятия не имею, почему.
Одна из ошибок: -
'не существует подходящего конструктора для преобразования из "float" в "float2"'
строка 32
которая является строкой для закрывающей скобки ядра.
Я не конвертирую напрямую из float в float2, поэтому я в замешательстве!
Кто-нибудь знает, что не так?
using Hybridizer.Runtime.CUDAImports;
using System;
namespace residentarraytest
{
class Program
{
[EntryPoint]
private static void ExtractArea(FloatResidentArray im,
ResidentArrayGeneric<int> roi,
ResidentArrayGeneric<float2> res)
{
int cp = roi[2] / 2;
int yPos = (1024 - roi[1]) - cp; // Y reversal just because...
int xPos = roi[0] - cp;
ExtractLoop(im, res, roi[2], yPos, xPos);
return;
}
[Kernel]
private static void ExtractLoop(FloatResidentArray im,
ResidentArrayGeneric<float2> res,
int size, int yPos, int xPos)
{
Parallel2D.For(0, size, 0, size, (y, x) =>
{
int i = x + y * size;
int j = x + xPos + (y + yPos) * size;
float2 tmp = new float2(im[j], 0f);
res[i] = tmp;
});
}
static void Main(string[] args)
{
ResidentArrayGeneric<int> roi = new ResidentArrayGeneric<int>(3);
roi[0] = 512; roi[1] = 512; roi[2] = 256;
FloatResidentArray im = new FloatResidentArray(1024 * 1024);
// im is filled with data here;
ResidentArrayGeneric<float2> res =
new ResidentArrayGeneric<float2>(roi[2] * roi[2]);
cudaDeviceProp prop;
cuda.GetDeviceProperties(out prop, 0);
HybRunner runner = HybRunner.Cuda();
// create a wrapper object to call GPU methods instead of C#
dynamic wrapped = runner.Wrap(new Program());
roi.RefreshDevice();
im.RefreshDevice();
res.RefreshDevice();
wrapped.ExtractArea(im, roi, res);
// program continues
Console.Out.WriteLine("DONE");
}
}
}