DSP

计算一个数组所有元素之和(无锁方法)

2019-07-13 20:27发布

上一贴介绍了比较常见的基于旋锁的并行计算方法。这里将介绍另一种无锁的并行计算方法。两者各有利弊。 同样是计算一个数组,在Blackfin561双核DSP中,可以利用两个核对一个数组进行同时计算,其中一个核计算该数组的前50个元素,另一个核计算该数组的后50个元素。 下面贴除源代码:   // 在共享存储区
//  shared.c

int resultA = 0, resultB = 0;

int progress = 0;


int array[100];
  // 核A
// main.cpp

extern int array[100];
extern int resultA, resultB, progress;

int main(void)
{
    
// initialize the array
    for(int i=0; i<100; i++)
        array[i] 
= i + 1;
        
    register 
int result = 0;
      
    SICA_SYSCR 
&= ~0x20;    // Enable and activate core B
    
    
for(int i=0; i<50; i++)
        result 
+= array[i];    // calculate first 50 elements
        
    resultA 
= result;
    progress
++;                // this subtask has been completed
    
    
while(progress < 2);    // wait for the other subtask
    
    TRACE(
"The answer is: %d ", resultA + resultB);

    
return 0;
}

  // 核B
// main.cpp

extern int array[100];
extern int resultB, progress;

int main(void)
{
    register 
int result = 0;
    
    
for(int i=50; i<100; i++)
        result 
+= array[i];        // calculate last 50 elements
        
    resultB 
= result;
    progress
++;

    
return 0;
}