C++ 能否以有效的方式在模拟循环内多线程?

C++ 能否以有效的方式在模拟循环内多线程?,c++,multithreading,performance,parallel-processing,C++,Multithreading,Performance,Parallel Processing,我的问题是如何正确地设计以下多线程,使其不会降低模拟的性能,而不是提高模拟的性能 假设您有一个名为MyClass的类,它包含两个大数组(每个大约500MB)和一个通过使用这些数组处理信息的函数: class MyClass { private: int *data1 = new int[ARRAY_SIZE](); int *data2 = new int[ARRAY_SIZE](); public: void fillData(); //any function th

我的问题是如何正确地设计以下多线程,使其不会降低模拟的性能,而不是提高模拟的性能

假设您有一个名为
MyClass
的类,它包含两个大数组(每个大约500MB)和一个通过使用这些数组处理信息的函数:

class MyClass
{
private:
    int *data1 = new int[ARRAY_SIZE]();
    int *data2 = new int[ARRAY_SIZE]();

public:
    void fillData(); //any function that fills the inner data
    void processData(const int iteration);
}
模拟的每次迭代都会处理4个
MyClass
实例。在我的理想世界中,我想做的是将每个这样的实例传递给一个线程,然后在每个线程内部调用
instance.processData()
。使用
#include
它看起来如下所示:

int main()
{
    MyClass inst1,inst2, inst3, inst4;

    //<----- here you would have code that fills the arrays inside each instance of MyClass

    for(int iteration=0; iteration<MAX_ITERATIONS; iteration++)
    {
        std::thread t1(&MyClass::processData, &inst1, iteration);
        std::thread t2(&MyClass::processData, &inst2, iteration);
        std::thread t3(&MyClass::processData, &inst3, iteration);
        std::thread t4(&MyClass::processData, &inst4, iteration);

        t1.join();
        t2.join();
        t3.join();
        t4.join();
    }

    return 0;
}
intmain()
{
我的班级分别是1、2、3、4;

// 使用四个线程而不是一个线程可能会导致性能下降。以下是需要检查的基本情况:

  • 并行化开销:这是创建和同步线程的成本。如果在
    processData
    中完成的工作量较低,并且您有大量迭代,那么线程创建和销毁成本可能是一个问题。如果您在
    processData()中有任何同步构造
    ,如屏障、锁或原子操作,这些都可能是减速的原因

  • :当单个线程执行时,活动内存集(正在写入和读取的内存)通常比多个线程运行时小得多。这可能会导致更多的缓存未命中(即,由于多个线程必须共享二级和三级缓存)。如果您的程序超出了系统上的物理内存量(即交换),则多个线程可能会导致页面抖动,而单线程则不会

  • 资源争用:如果您的进程正在读/写磁盘或网络,那么您可能会遇到类似于对该资源进行重击的情况,不同的线程会阻止彼此有效地访问该资源

  • :这是线程写入和读取同一缓存线上的不同位置的地方,在缓存线失效和刷新时,会反复导致计算被丢弃

有助于更好诊断的问题:

  • 当连续运行时,每次迭代的总挂钟执行时间是多长

  • 当有四个线程时,每次迭代的总挂钟执行时间是多长

  • 什么类型的操作/算法是
    processData()
    (例如排序、稀疏线性代数、密集线性代数)

  • 该系统的物理规格是什么(即,它有多少物理和逻辑内核,缓存有多大,有多少物理内存)

  • 执行了多少次迭代


  • 在循环中执行线程开销是非常低效的。关于
    PS2
    ,是的,请提供一个示例。特别是,很难回答您关于“每次迭代中每个实例的数据结果之间的比较”的评论因为这是关于性能的,所以这个例子也应该有类似的性能特征,这样MCVE中的改进可能会转化为真正的代码。