Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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++ 线程c+的向量中的假缓存共享+;_C++_Multithreading_Caching_Pthreads - Fatal编程技术网

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

C++ 线程c+的向量中的假缓存共享+;,c++,multithreading,caching,pthreads,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

我试图使用另一个向量(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];
        }           
}
void threadsum(int threadID、int numThreads、const vector&v、vector&localSum)
{
size\u t start=threadID*v.size()/numThreads;
size\u t stop=(threadID+1)*v.size()/numThreads;
localSum[threadID]=0.0;
对于(大小\u t i=开始;i<停止;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);
//创建输入向量v并在v中输入一些值
向量v(N);
对于(int i=0;i

现在,我怎样才能避免这个问题呢?。我的一个想法是使用互斥来限制访问localSum的时间。我的另一个想法是可能错误地对齐向量的元素,这样它们就不会在同一缓存线上了?。任何解决这个问题的想法都将不胜感激

在局部变量中累积每个线程的总和,然后将其保存到循环末尾的
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;
size\u t stop=(threadID+1)*v.size()/numThreads;
双和=0.0;
对于(大小\u t i=开始;i<停止;i++){
总和+=v[i];
}
localSum[threadID]=sum;

缓存线共享仍然存在这个问题,但您只能执行一次写入而不是N次写入。此外,使用这种形式的循环,优化器应该能够做得更好。

这可能会很有用,谢谢,但在这种情况下,他使用的是固定的数组大小,我的想法是使用向量,这样线程的数量可以增加。优化器难道不能执行类似的优化吗?@LWimsey可能。如果它需要处理可能的别名(其中
v
localSum
指的是同一个向量),它就不能。这个解决方案不依赖于优化器,这对调试构建(不进行优化)很有帮助。问题是我使用的是优化器,而v和LocalSum引用的不是同一个优化器vector@JmonkG但是编译器在生成代码时并不知道它们是不同的。通常情况下,它不会优化对非本地功能的内存的写操作,因为如果它这样做的话,会有太多的方法出错。