向量的并行和

A-A*_*A-A 6 c++ parallel-processing multithreading openmp

有人可以提供一些建议,说明如何通过多线程减少循环运行时的以下内容?假设我还有两个名为'a'和'b'的向量.

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

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

我试过按如下方式修改循环.我没有向量'a',而是有16个向量,并假设第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
    }

}
Run Code Online (Sandbox Code Playgroud)

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

Ali*_*232 5

omp为您的程序创建线程,无论您插入pragma标记,因此它为内部标记创建线程,但问题是创建了16个线程,每个线程执行1次操作,然后使用您的方法销毁所有线程.创建和销毁线程需要花费大量时间,因此您使用的方法会增加整个过程的时间,尽管它使用全部16个核心.你没有必要创建内部fors只需将#pragma omp parallel for标签放在你的8000循环之前它就可以在各个步骤之间分隔值,所以你创建第二个循环所做的就是omp的工作.那样omp只创建一次线程,然后处理500个数字,使用每个线程并在此之后结束所有线程(使用499个线程创建和销毁)