是否有可能在c ++中使用open mp进行初始化?

时间:2015-09-05 03:35:01

标签: c++ for-loop openmp

我有一个for循环,它在每次迭代中访问许多内存指针。对于每个内存指针,我创建了一个索引。我的问题是,当我尝试使用open mp来并行化这个循环时,我得到以下错误:

错误:预期的迭代声明或初始化

我认为此错误将是以下之一:

-Open MP不接受不同于++或 - 的增量 -Open MP不接受循环中的多次初始化

出于性能原因,使用这些多个索引对我来说很重要。有人知道我的问题的答案吗?

这是代码:

gzip

1 个答案:

答案 0 :(得分:1)

那么,看看第三个子句,你正在进行许多固有的顺序计算,这些计算取决于循环前一次迭代结束时的程序状态。你可以移动所有这些操作但是循环体内的+ =和++更新,并且从事物的外观可能使循环条件依赖于iNF,对吗?但其中一些看起来仍然可能是ordered。对于并行算法,是否存在闭环形式的初始值设定项,您可以在循环体内使用,仅依赖于i或某些循环不变量?

如果没有,并且每次迭代的输入确实取决于循环的先前迭代的结果,那么它不是并行算法

一个建议:

以下是我将如何解决这个问题。你只能初始化i并在循环中用常量递增它;但是,您可以等效地将所有其余操作移动到循环中。例如,我不知道循环体内还有什么,但如果iCF初始化为0,iNFsqrBcksDim,并且在每次迭代结束时,{{ 1}}设置为iCF的上一个值,iNF增加iNF,看起来您可以将循环重写为:

sqrBcksDim

你能为其他变量做到这一点吗?如果你真的有一个并行算法,你应该能够,因为循环的每次运行应该只依赖于i和循环不变量,你可以在初始化器中使用它。如果要在循环体外引用它,则需要在循环外声明一个变量,但暂时只声明一个新的局部变量并且不读取循环外的任何变量。你也写到循环内部。如果没有隐式顺序依赖,那么你应该能够在循环体的开头全部初始化它们。

你可能不会这样做,但它可能会帮助你思考如何重构。