线程向量中的虚假缓存共享c ++

时间:2017-11-24 14:31:16

标签: c++ multithreading caching pthreads

我正在尝试使用另一个向量( localSum )上的线程添加向量( v )的内容,如下面的代码所示:

void threadsum(int threadID, int numThreads, const vector<double>& v, vector<double>& localSum)
{
        size_t start = threadID * v.size() / numThreads;
        size_t stop = (threadID + 1) * v.size() / numThreads;
        localSum[threadID] = 0.0;
        for (size_t i = start; i < stop; i++) {
            localSum[threadID] += v[i];
        }           
}

目前,我遇到了关于虚假缓存共享问题的性能问题,因为每个线程都试图在同一缓存行上的不同位置写入。向量 v 和线程 localSum 的向量声明如下:

// create the input vector v and put some values in v
        vector<double> v(N);
        for (int i = 0; i < N; i++)
                v[i] = i;

        // this vector will contain the partial sum for each thread

        vector<double> localSum(numThreads, 0);

现在,我该如何避免出现这个问题?我得到的一个想法是使用互斥锁来限制访问 localSum 的时间。我的其他想法可能是错过了向量的元素,所以它们不会在同一个缓存行上?任何解决这个问题的想法都会非常感激!。

1 个答案:

答案 0 :(得分:1)

累计局部变量中每个线程的总和,然后在循环结束时将其保存到localSum

size_t stop = (threadID + 1) * v.size() / numThreads;
double sum = 0.0;
for (size_t i = start; i < stop; i++) {
    sum += v[i];
}
localSum[threadID] = sum;

你仍然会遇到缓存行共享的问题,但你只会做一次写而不是N.另外,使用这种形式的循环,优化器应该能够做得更好。