并行读取小型(大约10个元素)类指针向量的最快方法是什么?

时间:2018-12-20 03:29:25

标签: c++ multithreading optimization

我正在寻找最快的方法来让多个线程从同一个小的向量中读取(一个不是静态的,但是只会被主线程更改,并且只会在子线程不从中读取时)指针。

我尝试使用共享的std::vector指针,它比共享的指针数组快一些,但每个线程仍然慢...我认为这样做的原因是线程在内存导致错误共享,但我不确定。
我希望有一种解决方法,因为仅当线程正在访问数据时才读取数据,或者有一种完全不同的方法,速度更快。以下是一个最小示例

#include <thread>
#include <iostream>
#include <iomanip>
#include <vector>
#include <atomic>
#include <chrono>

namespace chrono=std::chrono;

class A {
public:
    A(int n=1) {
        a=n;
    }
    int a;
};

void tfunc();

int nelements=10;
int nthreads=1;

std::vector<A*> elements;
std::atomic<int> complete;
std::atomic<int> remaining;
std::atomic<int> next;
std::atomic<int> tnow;
int tend=1000000;

int main() {
    complete=false;
    remaining=0;
    next=0;
    tnow=0;
    for (int i=0; i < nelements; i++) {
        A* a=new A();
        elements.push_back(a);
    }

    std::thread threads[nthreads];
    for (int i=0; i < nthreads; i++) {
        threads[i]=std::thread(tfunc);
    }
    auto begin=chrono::high_resolution_clock::now();
    while (tnow < tend) {
        remaining=nthreads;
        next=0;
        tnow += 1;
        while (remaining > 0) {}
        // if {elements} is changed it is changed here
    }
    complete=true;
    for (int i=0; i < nthreads; i++) {
        threads[i].join();
    }
    auto complete=chrono::high_resolution_clock::now();
    auto elapsed=chrono::duration_cast<chrono::microseconds>(complete-begin).count();
    std::cout << std::setw(2) << nthreads << "Time - " << elapsed << std::endl;
}

void tfunc() {
    int sum=0;
    int tpre=0;
    int curr=0;
    while (tnow == 0) {}
    while (!complete) {
        if (tnow-tpre > 0) {
            tpre=tnow;
            while (remaining > 0) {
                curr=next++;
                if (curr > nelements) break;
                for (int i=0; i < nelements; i++) {
                    if (i != curr) {
                        sum += elements[i] -> a;
                    }
                }
                remaining--;
            }
        }
    }
}

在我的系统输出中nthreads介于1到10之间(时间以微秒为单位)

1  Time - 281548
2  Time - 404926
3  Time - 546826
4  Time - 641898
5  Time - 714259
6  Time - 812776
7  Time - 922391
8  Time - 994909
9  Time - 1147579
10 Time - 1199838

我想知道是否有更快的方法来完成此操作,或者由于矢量的小巧,这种并行操作是否总是比串行操作慢。

0 个答案:

没有答案