gpt4 book ai didi

c++ - 是否可以在 C++ 中使用 openmp 进行乘法初始化?

转载 作者:行者123 更新时间:2023-11-30 05:39:21 25 4
gpt4 key购买 nike

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

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

我认为这个错误会是以下之一:

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

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

代码如下:

#pragma omp parallel default(shared)
{
int tID = omp_get_thread_num();
int i, iCF, iPF, iNF, iPJG, iCJG, iNJG, iPRJG, iCRJG;

##pragma omp for nowait
for(i=0, iCF=0, iPF=0, iNF=sqrBcksDim, iPJG=0, iCJG=0, iNJG=sqrBcksSize, iPRJG=0, iCRJG=0 ; iCF<RHSArraySize ; iPF=iCF, iCF=iNF, iNF+=sqrBcksDim, iPJG=iCJG, iCJG=iNJG, iNJG+=sqrBcksSize, iPRJG=iCRJG, iCRJG+=rectBcksSize, ++i)
{
}
}

最佳答案

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

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

一个建议:

以下是我尝试解决此问题的方法。您只能初始化 i 并在循环中将其递增一个常量;但是,您可以等效地将所有这些操作的其余部分移到内部循环中。例如,我不知道循环体内还发生了什么,但是如果 iCF 初始化为 0,则 iNFsqrBcksDim 并且在每次迭代结束时,iCF 设置为 iNF 的先前值并且 iNF 增加 sqrBcksDim , 看起来您可以将循环重写为:

int i;

#pragma omp for nowait
for ( i=0; i < RHSArraySize/sqrBcksDim; ++i )
{
const int iCF = i*sqrBcksDim;
const int iNF = iCF + sqrBcksDim;
// ...
}

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

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

关于c++ - 是否可以在 C++ 中使用 openmp 进行乘法初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32409253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com