c++ - vector 的平行和

标签 c++ multithreading parallel-processing openmp

有人可以就如何通过多线程减少以下 for 循环的运行时间提供一些建议吗?假设我还有两个名为“a”和“b”的 vector 。

for (int j = 0; j < 8000; j++){
    // Perform an operation and store in the vector 'a'
    // Add 'a' to 'b' coefficient wise
}

这个for循环在我的程序中执行了很多次。上面for循环中的两个操作已经优化过了,但是它们只运行在一个核上。但是,我有 16 个内核可用,我想利用它们。

我试过按如下方式修改循环。我没有 vector “a”,而是有 16 个 vector ,并假设第 i 个称为 a[i]。我的 for 循环现在看起来像

for (int j = 0; j < 500; j++){
    for (int i = 0; i < 16; i++){
        // Perform an operation and store in the vector 'a[i]'
    }
    for (int i = 0; i < 16; i++){
        // Add 'a[i]' to 'b' coefficient wise
    }

}

我通过在每个内部循环之前添加“#pragma omp parallel for”在内部的每个 for 循环上使用 OpenMp。我所有的处理器都在使用中,但我的运行时间只显着增加。有没有人对我如何减少这个循环的运行时间有什么建议?先感谢您。

最佳答案

omp 会在您插入 pragma 标记的任何地方为您的程序创建线程,因此它会为内部标记创建线程,但问题是创建了 16 个线程,每个线程执行 1 个操作,然后使用您的方法销毁所有线程。创建和销毁线程会花费大量时间,因此您使用的方法会增加进程的总时间,尽管它使用了所有 16 个内核。您不必创建内部 fors,只需在 8000 循环之前放置 #pragma omp parallel for 标记,由 omp 来分隔踏板之间的值,因此创建第二个循环所做的工作是 omp 的工作.这样 omp 只创建一次线程,然后使用每个线程处理 500 个数字,然后结束所有这些数字(使用更少的 499 个线程创建和销毁)

关于c++ - vector 的平行和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6241271/

相关文章:

c++ - 埃拉托色尼筛法算法

python - 如何在 Python 中使用线程?

c++ - OpenMP:一次为线程分配一个迭代

c++ - 如何检测哪个互斥锁为操作系统提供了最多的时间?

java - 并发 CPLEX 进程比单个进程慢很多

c++ - 为什么这段代码的 vector 迭代器没有停止?

c++ - 在 C/C++ 中,是否保证 volatile 变量在线程之间具有最终一致的语义?

c++ - C++ XAML 游戏中的 Direct2d 访问冲突

Java - 同步线程 - 输出顺序错误

ios - 如何修复 Xcode 中的线程错误?