有人可以就如何通过多线程减少以下 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/