我有兩個BOOL的三維數組,我想在它們之間進行掩碼。 我的意思是創建第三個數組:third[i][j][k] = first[i][j][k] && second[i][j][k]
,對於每個i,j,k。C語言高效的數組掩碼
- 我用c語言(可能是組裝)
- 我需要使遮蔽操作將盡可能快地
- 可以假設第一和第二具有相同的尺寸。
- 如果它可以提高性能,我可能會重新排列陣列中的數據到其他數據排列。
編輯:每個陣列尺寸爲100
謝謝!
我有兩個BOOL的三維數組,我想在它們之間進行掩碼。 我的意思是創建第三個數組:third[i][j][k] = first[i][j][k] && second[i][j][k]
,對於每個i,j,k。C語言高效的數組掩碼
編輯:每個陣列尺寸爲100
謝謝!
我的評論中提到這一點,但這裏的一些工作的代碼(希望我沒有測試這個我也沒有給它通過一個編譯器。這只是想法)。如果你有你想建模爲一個位掩碼數組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
謝謝你的回答,但我的目的是優化所有過程 –
我想說的只是分析會回答你的問題,我不會爲你做的,但我會簡單地用一個去循環,只有懶得真的看得更遠如果未能履行。
不要過早優化。
你知道的,安排在內存中的數據,使所有的計算可以在一個做(非常優化,SSE等)循環會有所幫助。但是,考慮到你正在訪問很多內存,因此操作速度非常非常快,因此優化將不會太多。而且,如果您選擇重新排列內存,則排列過程可能比計算本身慢。
望着這個問題,在我腦海中由Charles Petzold的文章書「漂亮的代碼」。您可以爲循環的每一行(100種不同的代碼模式)的每個值生成代碼模式,只有相應的位值爲1時纔會生成分配,然後根據行的位值對「正確執行」進行「junp」你正在處理。您需要使用不同掩碼的位域。在轉換一個3嵌套循環到2嵌套循環與用於內部循環(不壞)優化的代碼,具有使用一些其他實用程序(或只是簡單的C/C++)的代碼本身的不同的值,以產生內循環。你應該閱讀這一章來理解它。真的很整齊。
取代'布爾ARR [] [] []',我會使用一個掩碼來存儲數據。使用位掩碼將更自然,幾乎肯定會更有效。 – yan
正在做作業嗎? –
@hexa不,這是從圖片analisys –