我有一个for循环,它在每次迭代中访问许多内存指针。对于每个内存指针,我创建了一个索引。我的问题是,当我尝试使用open mp来并行化这个循环时,我得到以下错误:
错误:预期的迭代声明或初始化
我认为此错误将是以下之一:
-Open MP不接受不同于++或 - 的增量 -Open MP不接受循环中的多次初始化
出于性能原因,使用这些多个索引对我来说很重要。有人知道我的问题的答案吗?
这是代码:
gzip
答案 0 :(得分:1)
那么,看看第三个子句,你正在进行许多固有的顺序计算,这些计算取决于循环前一次迭代结束时的程序状态。你可以移动所有这些操作但是循环体内的+ =和++更新,并且从事物的外观可能使循环条件依赖于iNF,对吗?但其中一些看起来仍然可能是ordered
。对于并行算法,是否存在闭环形式的初始值设定项,您可以在循环体内使用,仅依赖于i
或某些循环不变量?
如果没有,并且每次迭代的输入确实取决于循环的先前迭代的结果,那么它不是并行算法
一个建议:
以下是我将如何解决这个问题。你只能初始化i
并在循环中用常量递增它;但是,您可以等效地将所有其余操作移动到循环中。例如,我不知道循环体内还有什么,但如果iCF
初始化为0,iNF
到sqrBcksDim
,并且在每次迭代结束时,{{ 1}}设置为iCF
的上一个值,iNF
增加iNF
,看起来您可以将循环重写为:
sqrBcksDim
你能为其他变量做到这一点吗?如果你真的有一个并行算法,你应该能够,因为循环的每次运行应该只依赖于i和循环不变量,你可以在初始化器中使用它。如果要在循环体外引用它,则需要在循环外声明一个变量,但暂时只声明一个新的局部变量并且不读取循环外的任何变量。你也写到循环内部。如果没有隐式顺序依赖,那么你应该能够在循环体的开头全部初始化它们。
你可能不会这样做,但它可能会帮助你思考如何重构。