OMP中的归约条款和崩溃条款都让我感到困惑,一些观点突然出现在我的脑海中
1.为什么reduction不能与minus一起使用?这里列出的限制
1.是否有任何解决方案来实现负?
1.一元运算符是如何工作的,即x还是x--?--或是应用于每个部分结果?还是在创建全局结果时只应用一次?这两种情况完全不同。
关于collapse..我们是否可以在嵌套循环上应用collapse,但中间要有一些代码行,例如
for (int i = 0; i < 4; i++)
{
cout << "Hi"; //This is an extra line. which breaks the 2 loops.
for (int j = 0; j < 100; j++)
{
cout << "*";
}
}
2条答案
按热度按时间yyyllmsg1#
1和2。对于minus,您要减去什么?如果您有两个线程,您要执行
result_thread_1 - result_thread_2
还是result_thread_2 - result_thread_1
?如果您有两个以上的线程,则会更加混乱:我是否只有一个负项,而所有其他项都是正项?是否只有一个正项,而其他项都是负项?是否混合?哪些结果是哪些结果?因此,不,没有解决方法。1.在
x++
或x--
事件中,假设它们在归约循环中,它们应该发生在每个部分结果上。1.是的,我想是的。
o8x7eapl2#
reduction子句要求运算是关联的,并且中的
x = a[i] - x
运算不是关联的。请尝试几次迭代。
但是
x = x - a[i]
确实有效,例如。然而,有一个变通办法。符号每隔一个术语交替。这里有一个工作解决方案。
这里有一个更简单的版本,它使用
reduction
子句。需要注意的是,奇数项都是一个符号,偶数项是另一个符号。因此,如果我们一次约简两项,符号不会改变,运算是结合的。可以像这样并行减少。