并行执行的不同类型及数据一致性处理
1. 函数并行性
1.1 单核心到多核心的转变:以冒泡排序为例
在一些场景中,如PC软件、智能手机和平板电脑,通常会有大量独立的应用程序并行执行。然而,在高性能计算中,函数并行性并不常见,不过图形处理中的渲染就是一个函数大规模并行化的例子。
在经典嵌入式领域,函数之间紧密关联,且很多函数最初是为单处理器核心(单核)开发的。当转向多核时,会遇到诸多问题,因为代码间的紧密交织使得不能简单地将代码拆分并分布到多个处理器核心上。下面以冒泡排序算法为例进行说明。
冒泡排序算法很简单,代码如下:
void BubbleSort(unsigned int* s, unsigned int size)
{
unsigned int i,j,temp;
for(i=1; i<size; i++) {
for(j=0; j<(size-i); j++) {
if(s[j] > s[j+1])
{
temp = s[j];
s[j] = s[j+1];
s[j+1] = temp;
}
}
}
}
对于一个包含n个元素的数组,内层循环迭代次数c的计算公式为:
[c = \sum_{i=1}^{n}(n - i) = \frac{n^2 - n}{2}]
这个数字对算法的执行时间