C++ 优化MD计算的循环
我在MD模拟中使用以下回路进行力计算:C++ 优化MD计算的循环,c++,optimization,openmp,C++,Optimization,Openmp,我在MD模拟中使用以下回路进行力计算: struct data_str{ int a = 0, b = 0; data_str(int a, int b) : a(a), b(b) { }; }; void work_func_both(std::vector<data_str> *data, int dist) { for(unsigned int i = 0; i < data->size()-1; i++) {
struct data_str{
int a = 0, b = 0;
data_str(int a, int b) : a(a), b(b)
{
};
};
void work_func_both(std::vector<data_str> *data, int dist)
{
for(unsigned int i = 0; i < data->size()-1; i++)
{
for(unsigned int j = i+1; j < data->size(); j++)
{
if(abs((*data)[i].a - (*data)[j].a) < dist)
{
(*data)[i].b += 3;
(*data)[j].b -= 1;
}
}
}
}
结果是
Both took 593.704, first took 547.549, second took 3394.53 and none took 856.049
我现在的问题是:为什么只有
\u second()
-函数在与原始版本比较时返回正确的结果,为什么它比所有其他循环慢得多?如何优化该循环以使其总体上更快?在_first()中,当多个线程访问数据时,似乎缺少了一些同步。假设您有两个线程,并且在某个时刻:第一个线程正在执行i=0,j=4和2dn之间的比较,第二个线程在i=4,j=6之间进行比较。如果第一个线程考虑修改数据(4),则会出现数据竞争和不可预知的结果。在这种情况下,如何同步数据?可能,对于BO()我也不太熟悉相同的数据竞争,抱歉,我不太熟悉OpenMP。至少,尝试重新设计算法,以避免多个线程访问相同的数据索引。有关寻址/优化此类代码的信息,请参阅。
g++-5 -std=c++14 -O3 -fopenmp main.cpp -lgomp -o main
Both took 593.704, first took 547.549, second took 3394.53 and none took 856.049