用并行算法实现一个数组求和?
求教各位高手啊,怎么写?
[解决办法]
简单一点的话(以双核并行执行为例):
一个核计算数组偶数索引项的和,另一个核计算奇数索引项的和,然后将两者相加。
In core A:
#include <stdio.h>
#define SICA_SYSCR*(volatile unsigned short*)0xffc00104
#define SICB_SYSCR*(volatile unsigned short*)0xffc01104
extern volatile int shared_coreB_start;
extern volatile int exec_complete;
extern volatile int coreB_answer;
extern volatile int array[9];// Why has the length here to be indicated explicitly?
int main(int argc, const char* argv[])
{
SICA_SYSCR &= ~0x20;// Enable core B
register const int n = sizeof(array) / sizeof(array[0]);
shared_coreB_start = n;
int sum = 0;
for(int i=0; i <n; i+=2)
sum += array[i];
while(exec_complete == 0);
printf( "The answer is: %d\n ", sum + coreB_answer);
return 0;
}
In Core B:
extern volatile int shared_coreB_start;
extern volatile int exec_complete;
extern volatile int coreB_answer;
extern volatile int array[];
int main(int argc, const char* argv[])
{
while(shared_coreB_start == 0);
register const int n = shared_coreB_start;
register int sum = 0;
for(int i=1; i <n; i+=2)
sum += array[i];
coreB_answer = sum;
exec_complete = 1;
return 0;
}
Shared memory:
volatile int shared_coreB_start = 0;
volatile int exec_complete = 0;
volatile int coreB_answer = 0;
volatile int array[] = { 10, 20, -5, 6, 8, 9, 17, 22, -3 };
输出:
P1: Breakpoint Hit at <ff600670>
P0: The answer is: 84
P1: Breakpoint Hit at <ff601a2a>
以上基于Blackfin561 DSP平台。结果正确。
这只是一个简单而直观的实现。