Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 优化MD计算的循环_C++_Optimization_Openmp - Fatal编程技术网

C++ 优化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++) {

我在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++)
    {
        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