c++ - 线程 vector 中的假缓存共享 C++

标签 c++ multithreading caching pthreads

我正在尝试使用另一个 vector (localSum) 上的线程添加一个 vector (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];
        }           
}

现在,我遇到了有关错误缓存共享问题的性能问题,因为每个线程都试图在同一缓存行的不同位置写入。 vector v和线程 vector 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 的时间。我的另一个想法可能是错位 vector 的元素,这样它们就不会在同一个缓存行上?任何解决此问题的想法将不胜感激!

最佳答案

在局部变量中累加每个线程的总和,然后在循环结束时将其保存到 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 次写入。此外,对于这种形式的循环,优化器应该能够做得更好。

关于c++ - 线程 vector 中的假缓存共享 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47475344/

相关文章:

python - 为什么 PyGILState_Release(...) 在这种情况下会出现段错误?

c - 以下代码中是否存在临界区?

html - 为什么我的页面不会停止缓存?

android - 在 Qt Android 项目中使用 OpenCV 时的链接顺序

c++ - 二进制文件写入数据两次

c++ - 在 Mac OS 10.8.2 中编译 VXL,找不到 X11/Xlib.h

linux - 在 futex 之前,线程/进程如何在 Linux 中停放和唤醒?

css - Assetic 生成了几个被删除的 CSS 文件

asp.net - 列出 OutputCache 条目

c++ - 错误 : name lookup of 'i' changed for ISO 'for' scoping