2011-08-16 54 views
1

我有兩個BOOL的三維數組,我想在它們之間進行掩碼。 我的意思是創建第三個數組:third[i][j][k] = first[i][j][k] && second[i][j][k],對於每個i,j,k。C語言高效的數組掩碼

  1. 我用c語言(可能是組裝)
  2. 我需要使遮蔽操作將盡可能快地
  3. 可以假設第一和第二具有相同的尺寸。
  4. 如果它可以提高性能,我可能會重新排列陣列中的數據到其他數據排列。

編輯:每個陣列尺寸爲100

謝謝!

+5

取代'布爾ARR [] [] []',我會使用一個掩碼來存儲數據。使用位掩碼將更自然,幾乎肯定會更有效。 – yan

+1

正在做作業嗎? –

+0

@hexa不,這是從圖片analisys –

回答

3

我的評論中提到這一點,但這裏的一些工作的代碼(希望我沒有測試這個我也沒有給它通過一個編譯器。這只是想法)。如果你有你想建模爲一個位掩碼數組100x100x100,那麼你就可以做到以下幾點:

// Create two bitmasks 
const unsigned int BITS_PER_BYTE = 8; 
const unsigned int DIM = 100; 
const unsigned int BITS_PER_VALUE = BITS_PER_BYTE * sizeof(unsigned long); 
const unsigned long MASK_SIZE = (DIM * DIM * DIM)/BITS_PER_VALUE; 
unsigned long bitmask1[MASK_SIZE] = {0}; 
unsigned long bitmask2[MASK_SIZE] = {0}; 
unsigned long bitmask_result[MASK_SIZE]; 

// Set the two bitmasks, this is probably sub-optimal but you 
// mention that setting bitmasks isn't supposed to be overly performant 

// set bitmask1 (repeat something similar for bitmask2) 
for (int i = 0; i < DIM; ++i) 
    for (int j = 0; j < DIM; ++j) 
    for (int k = 0; k < DIM; ++k) { 
     // set bitmask[i][j][k] to 1 
     unsigned int offset = DIM*DIM*i + DIM*j + k; 
     unsigned int long_offset = offset/BITS_PER_VALUE; 
     unsigned int bit_offset = offset % BITS_PER_VALUE; 
     // XXX SET THIS TO WHATEVER VALUE YOU HAVE, 1 FOR true and 0 
     // FOR false. I'M SETTING EVERYTHING TO TRUE FOR THE SAKE OF 
     // EXAMPLE 
     bitmask1[long_offset] = 1 << bit_offset; 
    } 

// Now to actually compare: 
for (int i = 0; i < MASK_SIZE; ++i) { 
    bitmask_result[i] = bitmask1[i] & bitmask2[i]; 

// and that's it. bitmask_result will now have your answers. decompose 
// the bitmask by doing the reverse of the above set loop 
+0

謝謝你的回答,但我的目的是優化所有過程 –

1

我想說的只是分析會回答你的問題,我不會爲你做的,但我會簡單地用一個去循環,只有懶得真的看得更遠如果未能履行。

不要過早優化。

2

你知道的,安排在內存中的數據,使所有的計算可以在一個做(非常優化,SSE等)循環會有所幫助。但是,考慮到你正在訪問很多內存,因此操作速度非常非常快,因此優化將不會太多。而且,如果您選擇重新排列內存,則排列過程​​可能比計算本身慢。

望着這個問題,在我腦海中由Charles Petzold的文章書「漂亮的代碼」。您可以爲循環的每一行(100種不同的代碼模式)的每個值生成代碼模式,只有相應的位值爲1時纔會生成分配,然後根據行的位值對「正確執行」進行「junp」你正在處理。您需要使用不同掩碼的位域。在轉換一個3嵌套循環到2嵌套循環與用於內部循環(不壞)優化的代碼,具有使用一些其他實用程序(或只是簡單的C/C++)的代碼本身的不同的值,以產生內循環。你應該閱讀這一章來理解它。真的很整齊。