我正在尝试使用另一个向量( 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 的时间。我的其他想法可能是错过了向量的元素,所以它们不会在同一个缓存行上?任何解决这个问题的想法都会非常感激!。
答案 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.另外,使用这种形式的循环,优化器应该能够做得更好。