我是这个特殊堆栈交换的新手。我不知道让事情变得漂亮的语法,抱歉。
我正在努力为娱乐项目最大化我的代码。我在C ++中编码,我使用OpenMP进行并行化。问题如下,这是实际代码的过度简化版本,比如我有:
//Lots of other stuff
#pragma omp parallel for ordered num_threads(4) schedule(dynamic, 100) private(a,b)
for(int a=0; a<230000; a++)
{
for(int b=a+1; b<230000; b++)
{
//code increments b at times, example
while(stored[b][0]==stored[a][0])
{
b++;
}
//increment counter
#pragma omp atomic
++counter;
//counting part
#pragma omp ordered
if(stored[a][0]!=stored[b][0])
{
if(stored[a][1]!=stored[b][1])
{
//print counter to file
}
}
}
}
基本上,我想计算代码运行的次数。但是,依赖性&#34; b = a + 1&#34;似乎使代码关闭。它给了我相同的数量,好像它只是&#34; b = 0&#34;,这大约是100亿。
非常感谢任何帮助。
编辑1:我应该提到循环内部的所有内容都与a无关。也就是说,它可以在a的任意方向上运行,也可以在a的任意随机值上运行,但必须在b中按顺序运行。整点是在b测量增量的某些约束下跳过尽可能多的b值,为此算法需要b中的顺序。
答案 0 :(得分:1)
我对你的代码感到有点困惑。如果你试图使代码并行,你为什么要在pragma中订购?有序将使它连续运行。如果您使用ordered获得了错误的答案,那么代码的其他部分可能是错误的。
我发现的一个问题是你在pragma语句之前声明了a和b。您可能不应该这样做,因此您的代码不会混淆。 a和b应该在for循环的范围内。
以下是我认为您正在寻找的代码。
// do not declare a or b in the code before or use different variables instead of a or b
int counter = 0;
#pragma omp parallel for num_threads(4) schedule(dynamic, 100)
for(int a=0; a<230000; a++)
{
int tmpCounter = 0;
for(int b=a+1; b<230000; b++)
{
//code increments b at times, example
while(stored[b][0]==stored[a][0])
{
b++;
}
//increment counter code
++tmpCounter;
//counting part
// idk if you need this code to be ordered?
if(stored[a][0]!=stored[b][0])
{
if(stored[a][1]!=stored[b][1])
{
//print counter to file
}
}
}
#pragma omp critical
counter += tmpCounter;
}
如果这不是您要找的内容,请在澄清之后评论我的帖子。我会尝试解决它。