OpenMP代码比串行版本慢 我试图用OpenMP并行化C++中的一段代码,但我发现结果比串行版本慢。 我试图访问我创建的矩阵中的元素,但我不明白为什么这会影响我在下面发布的代码的速度

OpenMP代码比串行版本慢 我试图用OpenMP并行化C++中的一段代码,但我发现结果比串行版本慢。 我试图访问我创建的矩阵中的元素,但我不明白为什么这会影响我在下面发布的代码的速度,c++,openmp,C++,Openmp,我开始学习openMP,所以我可能没有看到一些明显的错误 代码如下: long firstProcessorItem=numberColdStartItem/2; long secondProcessorItem=numberColdStartItem-firstProcessorItem; long processorId; cout<<"ciao"<<endl; #pragma omp parallel private(processorId) num_threads

我开始学习openMP,所以我可能没有看到一些明显的错误

代码如下:

long firstProcessorItem=numberColdStartItem/2;
long secondProcessorItem=numberColdStartItem-firstProcessorItem;
long processorId;
cout<<"ciao"<<endl;
#pragma omp parallel private(processorId) num_threads(2)
{
processorId=omp_get_thread_num();
cout<<processorId<<endl;
auto cpu=sched_getcpu();
cout<<"dsgahrtbw"<<cpu;
if (processorId==0) {
    cout<<"aaa"<<endl;
    for (int j=1; j<=firstProcessorItem; j++) {
        vector<CoupleItem<scalar>> vettoreCopie;
        vettoreCopie.resize(numberPastItem);

        auto& writeColumn=predictions.getColumnNonConst(j);
        vector<scalar>& readColumn=similarityPastFuture.getColumnNonConst(j);

        for (int i=numberUsers; i>=1; i--) {

            auto& readRow=userRatingPast.getRowNonConst(i);
            long int sizeReadRow=readRow.size();
            computeCoupleVector(readRow, readColumn, vettoreCopie);

            if (sizeReadRow>N) {
                std::sort(vettoreCopie.begin(),vettoreCopie.begin()+sizeReadRow,compare);
                writeColumn[i-1]=fastScalarProduct(vettoreCopie, N);
            } else {
                writeColumn[i-1]=fastScalarProduct(vettoreCopie, sizeReadRow);
            }
        }
    }
}
if (processorId==1) {
    cout<<"bbb"<<endl;
    for (int j=firstProcessorItem+1; j<=numberColdStartItem; j++) {
        vector<CoupleItem<scalar>> vettoreCopie;
        vettoreCopie.resize(numberPastItem);

        auto& writeColumn=predictions.getColumnNonConst(j);
        vector<scalar>& readColumn=similarityPastFuture.getColumnNonConst(j);

        for (int i=1; i<=numberUsers; i++) {

            auto& readRow=userRatingPast.getRowNonConst(i);
            long int sizeReadRow=readRow.size();
            computeCoupleVector(readRow, readColumn, vettoreCopie);

            if (sizeReadRow>N) {
                std::sort(vettoreCopie.begin(),vettoreCopie.begin()+sizeReadRow,compare);
                writeColumn[i-1]=fastScalarProduct(vettoreCopie, N);
            } else {
                writeColumn[i-1]=fastScalarProduct(vettoreCopie, sizeReadRow);
            }
        }
    }
}

}
long firstProcessorItem=numberColdStartItem/2;
long Second ProcessorItem=numberColdStartItem firstProcessorItem;
长处理器;

你的数据有多大?如果这还不够,那么产生多个线程可能比实际工作更繁重。尝试增加它的大小(很多!取决于并行代码的速度)。此外,在线程之间分配工作的方式上还有一些改进的余地,但这不会提高速度。这是相当大的。。。运行串行版本需要60秒,运行并行版本大约需要70秒。我不知道出了什么问题。可以肯定的是,你终于有了一个双核处理器,对吗?如果这正是双核,是AMD还是Intel?AMD没有实现SMT,只有CMT,它在大多数任务中都比SMT慢。你的处理器有多少内核?如果它只有一个内核,那么并行版本将比串行版本慢。