2013-05-13 52 views
0

我正在讀取和寫入大量的FITS和DNG圖像,這些圖像可能包含與我的平臺和/或opencl設備不同的字節序數據。使用opencl交換字節順序的快速方法

如果需要,目前我在主機的內存中交換字節順序,這非常緩慢並且需要額外的步驟。

是否有一個快速的方法來傳遞int/float/short的緩衝區有錯誤的endianess到opencl-kernel?

使用額外的內核運行只是爲了修復endianess沒問題;使用一些無開銷的自動修復讀/寫操作將是完美的。

我知道變量的屬性((endian(host/device))),但這並不能幫助使用小端設備的小端平臺上的大端FITS文件。

我想到了這樣一個解決方案(既不執行也不進行測試,還):

uint4 mask = (uint4) (3, 2, 1, 0); 
uchar4 swappedEndianness = shuffle(originalEndianness, mask); 
// to be applied on a float/int-buffer somehow 

希望有一個更好的解決方案在那裏。

由於提前, runtimeterror

回答

2

肯定。既然你有一個uchar4--你可以簡單地調整組件並將其寫回。

output[tid] = input[tid].wzyx; 

混寫很也有很少的費用在SIMD架構的高性能,所以你應該能夠將其與其它操作在內核相結合。

希望這會有所幫助!

+0

哦 - 我以某種方式認爲「組件選擇語法」只是OpenGL。你是對的,這應該像魅力一樣工作! – 2013-05-14 08:52:48

1

大多數處理器架構在使用指令完成適合其寄存器寬度的操作(例如32/64位寬度)時性能最佳。當CPU/GPU執行這種按字節操作符時,使用下標.wxyz代替uchar4,它們需要使用掩碼從整數中檢索每個字節,然後移位該字節,然後使用整數add或or運算符結果。對於字節順序交換,處理器需要執行4以上的整數和移位,加/或4次,因爲有4個字節。

的最有效方式是如下

#define EndianSwap(n) (rotate(n & 0x00FF00FF, 24U)|(rotate(n, 8U) & 0x00FF00FF) 

n可以是任何gentype,例如,一個uint4變量。因爲OpenCL不允許C++類型的重載,所以最好的選擇是宏。