计算一个数组所有元素之和(基于多处理器的并行开发讨论)
来源:互联网 发布:js radio取消选中事件 编辑:程序博客网 时间:2024/04/28 14:27
我早些时候上传了 《双核协作完成搜索β》(详细可见我的资源),这个方法是无锁并行计算方法,下面介绍一种更长见的带锁的多处理器计算方法。这个方法若使用像OpenMP这样的编译工具的话会使得代码更好看,更自然一些。
以下代码是我基于Blackfin561双核DSP,VisualDSP++4.5环境下通过测试的。这个方法比无锁更容易实现,不过如果没有OpenMP的话,在对一些临界变量进行上锁时必须十分小心,加锁后务必不能忘了解锁。
// 在共享存储区中源文件中
// shared.c
#include <stdio.h>
#include "core_intr/core_sync.h"
// shared.c
#include <stdio.h>
#include "core_intr/core_sync.h"
#pragma file_attr("sharing=MustShare")
static volatile int array[100];
static volatile int callA = 0, callB = 0;
static volatile int sum = 0;
void InitArray(void)
{
int i;
for(i=0; i<100; i++)
array[i] = i + 1;
}
void InvokeCoreB(void)
{
callB = 1;
while(callA != 1);
}
void InvokeCoreA(void)
{
callA = 1;
while(callB != 1);
}
void CalculateArray0(void)
{
register int i;
for(i=0; i<100; i++)
sum += array[i];
}
void CalculateArray1(void)
{
static volatile int loopIndex = 0;
static volatile LOCK_TYPE lockForIndex = 0, lockForResult = 0;
register int tempIndex;
for(;;)
{
spin_try_getlock(&lockForIndex);
if(loopIndex >= 100)
{
spin_release_lock(&lockForIndex);
return;
}
tempIndex = loopIndex++;
spin_release_lock(&lockForIndex);
spin_try_getlock(&lockForResult);
sum += array[tempIndex];
spin_release_lock(&lockForResult);
}
}
register int tempIndex;
for(;;)
{
spin_try_getlock(&lockForIndex);
if(loopIndex >= 100)
{
spin_release_lock(&lockForIndex);
return;
}
tempIndex = loopIndex++;
spin_release_lock(&lockForIndex);
spin_try_getlock(&lockForResult);
sum += array[tempIndex];
spin_release_lock(&lockForResult);
}
}
void OutputResult(void)
{
printf("The answer is: %d/n", sum);
}
// 在核A中main.cpp
#include "./core_intr/intr.h"
EXTERN void InitArray(void);
EXTERN void CalculateArray1(void);
EXTERN void OutputResult(void);
EXTERN void CalculateArray0(void);
EXTERN void InvokeCoreB(void);
EXTERN void CalculateArray1(void);
EXTERN void OutputResult(void);
EXTERN void CalculateArray0(void);
EXTERN void InvokeCoreB(void);
int main(void)
{
SICA_SYSCR &= ~0x20; // 唤醒并激活核B
InitArray();
ssync();
InvokeCoreB();
CalculateArray1();
OutputResult();
return 0;
}
}
// 在核B的main.cpp中
EXTERN void CalculateArray1(void);
EXTERN void InvokeCoreA(void);
EXTERN void CalculateArray1(void);
EXTERN void InvokeCoreA(void);
int main(void)
{
InvokeCoreA();
CalculateArray1();
return 0;
}
下面再附上旋锁的实现方法:
- #ifndef SHARED_CORE_SYNC_H
- #define SHARED_CORE_SYNC_H
- #include "../../common/common.h"
- typedef uint32 LOCK_TYPE;
- EXTERN void core_delay(uint32 cycles);
- EXTERN BOOL core_lockEx(volatile LOCK_TYPE* pSpring);
- EXTERN void core_release_lockEx(volatile LOCK_TYPE* pSpring);
- _INLINE_ BOOL lock_try_get(volatile LOCK_TYPE* pSpring)
- {
- BOOL result;
- asm("testset(%1);"
- "%0 = cc;" :
- "=d"(result):
- "a"(pSpring)
- );
- return result;
- }
- _INLINE_ void spin_try_getlock(volatile LOCK_TYPE* pSpring)
- {
- while(!lock_try_get(pSpring));
- }
- _INLINE_ void spin_release_lock(volatile LOCK_TYPE* pSpring)
- {
- *pSpring = 0;
- }
- #endif
- 计算一个数组所有元素之和(基于多处理器的并行开发讨论)
- 计算一个数组所有元素之和(无锁方法)
- 计算一个数组所有元素之和(方法总结)
- 计算一个整型数组的元素之和
- 计算一个二维整数数组score所有元素的平均值。
- 求数组所有元素之和
- 求二位数组所有元素之和
- C语言 输出一个数组中,所有元素之和为0的子序列
- 递归计算数组元素之和
- 【并行计算-CUDA开发】CUDA线程、线程块、线程束、流多处理器、流处理器、网格概念的深入理解
- 【C语言】计算二维数组的边界元素之和
- 一维数组之求一个数组所有元素之和与平均值,并写出大于平均值的元素与其对应的下标。
- 计算两个整型数组元素之和
- 求一个数组中最大的相邻元素之和
- 求一个数组元素的所有排列组合
- 【求一个数组元素的所有排列组合】
- 【CUDA并行编程之七】数组元素之和
- 【CUDA并行编程之七】数组元素之和
- 闪回区的扩容方案
- 杂记(一)
- 2008春晚诗朗诵:温暖2008
- MySQL集群配置
- [转]ExtJs之Ext.widgets-Button,SplitButton,CycleButton
- 计算一个数组所有元素之和(基于多处理器的并行开发讨论)
- 我今天的感悟
- Windwos SDK开发 --实现BUTTON按钮的加载图片
- 初七,拜访朋友,眼看着假期将结束,心慌慌
- 关于G.729压缩问题的一些总结
- 看过北京信息化系统后的随笔
- 想见你,又害怕见你
- 好男人
- 锻炼腹肌