gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:07:24 27 4
gpt4 key购买 nike

我正在尝试使用另一个 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com