【发布时间】:2014-04-23 14:25:42
【问题描述】:
我一直在使用 C++ 代码来执行量子化学、原子和分子任务,其中隐含着大量使用数组(1D、2D、3D 等)的工作。我有一整堂课叫array 来处理这个问题。当然,从一开始,最基本的成员函数就是那些为这些数组动态分配内存、调整大小或删除它们的函数。
data = new double **[row]();
#pragma omp for schedule(static) nowait
for(unsigned int i = 0; i < row; ++i)
{
data[i] = new double *[column]();
}
现在我正在做的是使用 OpenMP 加速这些例程。对于大部分例程,我一直在使用schedule(static) nowait 子句将我的循环分成step/threads 的块,因为这些块花费几乎相同的时间由它们的线程处理。
但是对于像上面这样的循环,通过多次调用new 运算符,我有一种(不好的)感觉,这些循环的块在它们的线程中执行的时间并不相同,从某种意义上说,我应该考虑改用schedule(dynamic, chunk_size)。
你们同意吗?动态分配不是那么简单的任务,而且可能很昂贵,因此动态分配块的执行时间可能会有所不同。
实际上,我不确定我是否在堆栈碎片或类似的事情上犯了任何错误。欢迎提出建议。
PS.:我正在使用nowait 子句来尽量减少隐式障碍的瓶颈。
【问题讨论】:
-
为什么不预先分配内存呢?您知道自己需要多少,因此您可以使用单个
new(或者更好:单个std::vector用于所有线程)。 -
嗯,你知道,因为我有很多数学例程,在这些情况下性能是最重要的,我避免使用 STL 容器。甚至知道他们有多强大。我还调用了一些更喜欢 C 标准数组的第三个库。
-
一个
std::vector是一个C数组,周围有一个薄包装。如果你在并行 for 循环之外分配它并让它保持活动状态,你可以在循环内部将它作为一个普通数组使用。
标签: c++ arrays multithreading openmp dynamic-memory-allocation