2011-02-07 66 views
1

說我有兩個字符數組,每個位置是1或0. 這兩個數組計算在不同的進程中,然後發送回主要組合,所以每個只寫入他們的一定範圍陣列:在C中合併字節數組的最有效方法是什麼?

P1:[0,0,0,0,1,1,0,1]

P2:[1,0,1,1,0,0,0,0]

目標:[1,0,1,1,1,1,0,1]

但是,這些可能是非常大的數組。除了循環播放其中之一之外,還有一種超快速的方式嗎?

要澄清,他們應該OR'd。

+1

看看http://stackoverflow.com/questions/668280/whats-the-most-efficient-way-to-make-bitwise-operations-in-ac-array – 2011-02-07 12:51:21

+1

你必須發送0和1作爲char的?在將它們發送給主設備之前,可以將這些位打包成整數嗎?那麼你可以在主人中使用這兩個整數。 – Makis 2011-02-07 12:52:13

回答

2

假設字節粒度不夠好,你可能想使用memcpy將它們複製到輸出數組:

memcpy(goal, p2, 4); 
memcpy(goal + 4, p1 + 4, 4); 

您還可以通過讓p1p2只包含自己的範圍內優化這個,例如:

char p1[4] = { 1, 1, 0, 1 }; 
char p2[4] = { 1, 0, 1, 1 }; 
char goal[8]; 
memcpy(goal, p2, 4); 
memcpy(goal + 4, p1, 4); 

請注意,您可能還想查看位矢量打包 - 在每個字符中打包8位數據。這將爲大型陣列節省大量內存,但會使訪問複雜化。

0

我建議:

  1. 剖析,以確保這是一個真正的瓶頸。
  2. 調查「矢量樣式」,即通過對齊字節數組,然後使用常規線性循環處理儘可能多的字節,使用單機操作(可能通過訪問unsigned long long)。
  3. 重新整理以便子進程以更高效的格式處理報告,可能使用某種運行長度壓縮。
0

如果您在不同的處理器的工作也許你應該考慮使用MPI庫,減少操作,這是非常快

MPI_Reduce(p, goal, size, MPI_CHAR, MPI_LOR, goal_process_id, MPI_COMM_WORLD); 

如果使用的是不同的線程,然後OpenMP是也在方面的良好簡化代碼的(這是快速和骯髒的代碼):

#pragma omp parallel for reduction(|, out) 
for(int i=0; i<size; i++) 
    out[i] = p1[i] * p2[i]; 
0

是否有一個原因爲什麼使用陣列?因爲在速度和內存消耗方面最有效的方式無疑是實際在字節級別上工作。不必不必要地來回拋出陣列。

也許像這樣?

uint8 proc_n (void) 
{ 
    uint8 result = 0x00; 
    uint8 i; 

    for(i=0; i<8; i++) 
    { 
    if(something) 
    { 
     result |= (0x01 << i); 
    } 
    } 

    return result; 
} 



typedef uint8 (*Proc_ptr)(void); 

Proc_ptr proc_array [PROCESSES] = 
{ 
    proc_1, 
    proc_2, 
    ... 
}; 

uint8 result = 0x00; 

for(i=0; i<PROCESSES; i++) 
{ 
    result |= proc_array[i](); 
} 
相關問題