OutputBitmap.SetPixel(object_point_x,object_point_y,InputBitmap0.GetPixel(X,Y))
,经过一段时间,但最后我,打断了我的情况。
我们有两个Bitmap
:一个用于输出OutputBitmap
,另一个用于输入InputBitmap0
让我们分这任务分成部分:
- 为
x
做InputBitmap0.GetPixel()
,y
协调
- 然后,
OutputBitmap.SetPixel()
了不同坐标object_point_x, object_point_y
Cudafy不支持Bitmap
或Color
类型的数据。所以我将位图转换为byte
类型。
BitmapData InputBitmapData0 = InputBitmap0.LockBits(new Rectangle(0, 0, InputBitmap0.Width, InputBitmap0.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
IntPtr ptr0 = InputBitmapData0.Scan0;//pointer for color
int stride0 = InputBitmapData0.Stride;
byte[] input_ragba_color = new byte[InputBitmapData0.Stride * InputBitmap0.Height];
Marshal.Copy(ptr0, input_ragba_color, 0, bytes0);// Copy the RGB values of color value into the array.
我们已经复制InputBitmap0
到rgbValues
阵列的内容。现在我们需要做GetPixel()
的工作(得到R,G,B,A的值)。
我们还需要为OutputBitmap
做上述工作(制作数组),因为我们将在GPU中执行SetPixel()
,但我们稍后会将该数组复制回位图。
BitmapData OutputBitmapData = OutputBitmap.LockBits(new Rectangle(0, 0, OutputBitmap.Width, OutputBitmap.Height), ImageLockMode.WriteOnly, OutputBitmap.PixelFormat);
IntPtr ptr_output = OutputBitmapData.Scan0;
byte[] output_ragba = new byte[OutputBitmapData.Stride * OutputBitmap.Height];
它的GPU计算时间。让我们初始化GPU。
CudafyModule km = new CudafyTranslator.Cudafy();
GPGPU gpu = new CudafyHost.getDevice(CudafyModes.Target, CudafyModes.DeviceId);
gpu.LoadModule(km);
立即发送input_ragba_color
和output_ragba
到GPU,因为我们可以遍历数组和做任何计算。
byte[] dev_output_rgba_color = gpu.Allocate<byte>(output_ragba.Length);
byte[] dev_input_ragba_color = gpu.CopyToDevice(input_ragba_color);
gpu.Launch(N, 1).update_bitmap(x, y, object_point_x, object_point_y,int stride0, int OutputBitmapData.Stride,dev_input_ragba_color,dev_output_rgba_color);
现在内部GPU(内核)
[Cudafy]
public static void update_bitmap(GThread thread, int x,int y,int object_point_x,int object_point_y,int stride0, int OutputBitmapData_Stride,byte [] dev_input_ragba_color,byte [] dev_output_rgba_color)
{
dev_output_rgba_color[(object_point_y * OutputBitmapData_Stride) + (object_point_x * 4)] = input_ragba_color[(y * stride0) + (x * 4)];
dev_output_rgba_color[(object_point_y * OutputBitmapData_Stride) + (object_point_x * 4) + 1] = input_ragba_color[(y * stride0) + (x * 4) + 1];
dev_output_rgba_color[(object_point_y * OutputBitmapData_Stride) + (object_point_x * 4) + 2] = input_ragba_color[(y * stride0) + (x * 4) + 2];
dev_output_rgba_color[(object_point_y * OutputBitmapData_Stride) + (object_point_x * 4) + 3] = input_ragba_color[(y * stride0) + (x * 4) + 3];
}
我正在每个R,G,B,A,前的值:input_ragba_color[(y * stride0) + (x * 4) + 1]
,其解决第一任务 (InputBitmap0.GetPixel()
)
dev_output_rgba_color
取值input_ragba_color
例如:
dev_output_rgba_color[(object_point_y * OutputBitmapData_Stride) + (object_point_x * 4)] = input_ragba_color[(y * stride0) + (x * 4)];
这是解决我们的第二个任务(OutputBitmap.SetPixel()
)
我们现在知道,GPU已经填充的数组(dev_output_rgba_color
)我们OutputBitmap
。
gpu.CopyFromDevice(dev_output_rgba_color, output_ragba); //dev_output_rgba_color values will be assigned to output_ragba
gpu.FreeAll();
复印使用存储器指针,并从存储器解锁的结果返回给OutputBitmap
。
Marshal.Copy(output_ragba, 0, ptr_output, output_bytes);// Copy the RGB values of color value into the array.
OutputBitmap.UnlockBits(OutputBitmapData);
现在,OutputBitmap
包含更新的值。
这个问题过于宽泛,我已经投票将其关闭,因为这样 – talonmies
@talonmies我试图详细说明,以便贡献者能够轻松理解它!我可以学习解决它的一种可能方式,而不是关闭它? –
你还没有在这里问过一个严肃的问题。什么*确切*你知道什么? CUDA没有原生的C#绑定,你甚至没有说你使用的是什么框架。你了解位图数据格式吗?你有没有试过写一个内核?如果你有什么问题?这就是为什么这太宽泛。你已经发布了一个愿望清单,而不是[SO]问题 – talonmies