我正在使用while循环来启动几个omp任务。每个任务都需要复制一个相当大的对象(作为第一个私有对象)。由于我的设置,大对象(在此示例中为矢量)将被天真地复制两次:
struct bigStruct {
bool next() {
/* do something with m_bigVector */
}
std::vector<int> m_bigVector;
/* other (big) data members */
};
bigStruct s;
#pragma omp parallel
{
#pragma omp single
while (s.next()) {
auto obj = s.m_bigVector; //copy the first time
#pragma omp task firstprivate(obj) //copy the second time
{
/* do something with obj */
}
}
} //end parallel
Run Code Online (Sandbox Code Playgroud)
gcc优化(-O3)似乎并没有以任何方式优化两个复制步骤。一个(不太优雅的)解决方案是使用显式的new/delete:
#pragma omp parallel
{
#pragma omp single
while (s.next()) {
auto obj_ptr = new …Run Code Online (Sandbox Code Playgroud)