我有一个高度并行的问题。数百个独立的问题需要用相同的功能来解决。每个问题平均需要120毫秒(0.12秒)在一个单一的核心,但有很大的变化,一些极端和罕见的可能需要10倍的时间。每个问题都需要内存,但这是提前分配的。这些问题不需要磁盘I/O,并且它们在运行时不会来回传递任何变量。不过,它们确实访问同一个全局结构的不同部分(数组元素)。
基于其他人的代码,我有C++代码,这是可行的。(未显示结构的全局数组。)它运行20个问题(例如),然后返回。我认为20足以平衡4个核的变化。我看到执行时间已经从大约10点增加到现在的水平。
有一个Win32和一个OpenMP版本,它们在执行时间方面的行为几乎相同。我在一个4核Windows系统上运行这个程序.我在下面包含了一些OpenMP代码,因为它比较短。(我更改了名称等,以使其更加通用,而且我可能犯了错误-它不会单独编译。)
单线程版本的速度大约是2.3倍.因此,如果它需要230秒的单线程,它需要100 s多线程.我感到惊讶的是,速度并没有更接近4,核的数量。
我失望是对的吗?
我能做些什么来接近我的理论预期吗?
int split_bigtask(Inputs * inputs, Outputs * results)
{
for (int k = 0; k < MAXNO; k++)
results->solved[k].value = 0;
int res;
#pragma omp parallel shared(inputs, outputs)
{
#pragma omp for schedule(dynamic)
for (int k = 0; k < inputs->no; k++)
{
res = bigtask(inputs->values[k],
outputs->solved[k],
omp_get_thread_num()
);
}
}
return TRUE;
}发布于 2014-07-04 14:31:23
bigtask()中没有同步(很明显,但我仍然会首先检查它)。我个人认为你有案例2(“大全球阵列”)。
解决问题的方法(如果确实是第2种情况):
https://stackoverflow.com/questions/24574309
复制相似问题