2011-02-07 71 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](); 
} 
相关问题