我正在谷歌搜索一个提供一些简单的OpenMp算法的页面 . 可能有一个例子来计算巨大数据阵列的最小值,最大值,中值,平均值,但我无法找到它 .
至少我通常会尝试将数组划分为每个核心的一个块,然后进行一些边界计算以获得完整数组的结果 .
我只是不想重新发明轮子 .
补充说明:我知道有成千上万的例子可以简单地减少 . 例如计算PI .
const int num_steps = 100000;
double x, sum = 0.0;
const double step = 1.0/double(num_steps);
#pragma omp parallel for reduction(+:sum) private(x)
for (int i=1;i<= num_steps; i++){
x = double(i-0.5)*step;
sum += 4.0/(1.0+x*x);
}
const double pi = step * sum;
但是当这些算法不可用时,几乎没有留下用于减少算法的例子 .
4 回答
OpenMP(至少2.0)支持减少一些简单的操作,但不支持max和min .
在以下示例中,
reduction
子句用于生成总和,而critical
部分用于使用线程本地更新共享变量而不会发生冲突 .编辑:更清洁的实现:
在OpenMP 3.1中,可以通过简化子句实现min,max,你可以在this link看一下这个详细的例子 .
OpenMP不支持这些还原操作 . 考虑英特尔线程构建模块的parallel_reduce算法,您可以在其中实现任意算法 .
这是一个例子 . 它使用部分结果的总和 . 您可以实现任何您想要的功能 .
请检查此链接以获取其他减少算法 . http://cache-www.intel.com/cd/00/00/30/11/301132_301132.pdf#page=19请查看第3.3.1段 . 有一个关于在数组中找到最小值的示例 .
这是典型的减少问题 .
除了the page pointed by Suvesh之外,您可以查看reduction clause的文档 .