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