Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.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++;阵列访问程序不';t刻度_C++_Multithreading_Parallel Processing - Fatal编程技术网

C++ c++;阵列访问程序不';t刻度

C++ c++;阵列访问程序不';t刻度,c++,multithreading,parallel-processing,C++,Multithreading,Parallel Processing,我有一段简短的代码,它执行以下操作: 按顺序访问结构(vec1)数组 根据从struct数组中获取的值随机访问int数组(hashT) 使用从int数组获得的值修改struct数组的值 我在同一numa节点上的8个物理CPU上运行了该程序。但对于大小为5M的hashT(即其中有5M整数),我只获得了x7.2的加速比。我改变了hashT的大小,发现当它很小时,我得到了x7.9的加速比,但随着它变大,在某个点上(当数组中有3M整数时),加速比开始下降。我有一个200GB的RAM,所以内存应该不会有问

我有一段简短的代码,它执行以下操作:

  • 按顺序访问结构(vec1)数组
  • 根据从struct数组中获取的值随机访问int数组(hashT)
  • 使用从int数组获得的值修改struct数组的值
  • 我在同一numa节点上的8个物理CPU上运行了该程序。但对于大小为5M的hashT(即其中有5M整数),我只获得了x7.2的加速比。我改变了hashT的大小,发现当它很小时,我得到了x7.9的加速比,但随着它变大,在某个点上(当数组中有3M整数时),加速比开始下降。我有一个200GB的RAM,所以内存应该不会有问题。我还测量了内存带宽,我还没有接近最大可用带宽的一半。所以我认为这可能是由于缓存的争用。我有一个由所有线程共享的20MB三级缓存。但是我测量了二级和三级缓存未命中,发现无论使用多少线程,它们几乎是相同的(不过,增加hashT的大小确实会导致更多的缓存未命中)。所以我看不出加速比下降的原因。有人能给我一个主意吗

    #include<iostream>
    #include<vector>
    #include<chrono>
    #include<omp.h>
    #include<stdio.h>
    using namespace std;
    
    typedef std::chrono::milliseconds ms;
    
    struct Element{
        int a, b, c;
        Element() : a(0), b(1), c(2) {}
        Element(int aa, int bb, int cc) : a(aa), b(bb), c(cc) {}
    };
    
    int main(int argc, char *argv[]){
        int HASHT_SIZE = atoi(argv[1]);
        int RID_SIZE = 5000000;
    
        auto start = std::chrono::high_resolution_clock::now();
        auto end = std::chrono::high_resolution_clock::now();
    
            vector<vector<Element> > vec1(40);
            for(size_t i = 0; i < vec1.size(); i++){
                vec1[i].reserve(RID_SIZE);
                for(size_t j = 0; j < vec1[i].capacity(); j++){
                    vec1[i].push_back(Element(rand() % HASHT_SIZE,0,0));
                }
            }
    
            //initialize hashT
            vector<int> hashT;
            hashT.reserve(HASHT_SIZE);
            for(int i = 0; i < HASHT_SIZE; i++){
                hashT.push_back(rand() % 2);
            }
    
            start = std::chrono::high_resolution_clock::now();
    
            //test program
            #pragma omp parallel for schedule(dynamic)
            for(int j = 0; j < 40; j++)
            { 
                for(size_t i = 0; i < RID_SIZE; i++){
                    int nid = hashT[vec1[j][i].a];
                    for(int k = 0; k < 10; k++){
                        vec1[j][i].b += nid / (k+1);
                        vec1[j][i].c += nid / (k+1);
                    }
                }
            }
    
            end = std::chrono::high_resolution_clock::now();
    
            for(int i = 0; i < 40; i++){
                        for(int j = 0; j < 10; j++){
                                cout << vec1[i][j].a << vec1[i][j].b << vec1[i][j].c;
                        }
                }cout << endl;
    
        cout << "Time used: " << std::chrono::duration_cast<ms>(end - start).count() << endl;
    
        return 0;
    }
    
    #包括
    #包括
    #包括
    #包括
    #包括
    使用名称空间std;
    typedef std::chrono::毫秒ms;
    结构元素{
    INTA、b、c;
    元素():a(0),b(1),c(2){
    元素(intaa,intbb,intcc):a(aa),b(bb),c(cc){
    };
    int main(int argc,char*argv[]){
    int HASHT_SIZE=atoi(argv[1]);
    int RID_尺寸=5000000;
    自动启动=标准::时钟::高分辨率时钟::现在();
    自动结束=标准::时钟::高分辨率时钟::现在();
    载体vec1(40);
    对于(size_t i=0;i