繁体   English   中英

对于矩阵初始化,openmp比串行慢

[英]openmp is slower than serial for matrix initialization

我只是在学习如何使用openmp,但是通过执行以下操作会使其变慢。 基本上,我只是试图初始化一个巨大的二维矩阵。

219     int **scoreMatrix = malloc(sizeof(int *) * (strlen(seq1)+1));
220 
221     int i,j = 0;
222     omp_set_num_threads(6);
224 #pragma omp parallel private(i,j) 
225 {
226     int std = omp_get_thread_num();
227     //Initialize matrix
228     for(i = std; i < strlen(seq1)+1; i=i+nthreads){
229         scoreMatrix[i] = malloc(sizeof(int) * (strlen(seq2)+1));
230         for(j = 0; j < strlen(seq2)+1; j++){
231             scoreMatrix[i][j] = 0;
232         }
233     }
234 }

请告诉我OpenMP中是否缺少任何重要的语法或概念。 谢谢!

自从我上次使用OpenMP以来已经有一段时间了,您的问题很可能归结为开销,并且每个线程完成的工作都非常小。 您需要每个线程设置执行1/6的malloc和1/6的设置为0。对于这样的问题,您应该考虑seq1和seq2的大小以及实际上并行执行的工作量。 例如,由标准malloc进行的内存分配可能是一个争用点,例如,请参阅此问题并进行更详细的分析。 如果大部分工作是由malloc完成的,因此不能在很大程度上并行执行,那么您就不会为支付线程初始化的开销而获得很大的提速。 如果确实需要它,则可以通过使用其他分配器获得改进。 将内存区域设置为0可以在线程之间进行拆分,但是与分配相比,几乎可以肯定这是非常快的。 由于在线程之间共享高速缓存行,因此在行229上设置scoreMatrix [i]可能还会有一些高速缓存一致性开销。

使用OpenMP和MPI时,请务必记住,简单地启动并行计算部分会涉及开销,因此,即使工作量很高的块,即使它们可能高度并行,也可能不值得并行化。 当您开始对数组进行计算时,您很有可能会看到好处。

通常,要将内存清零,最好的选择是记忆集,但编译器可能会优化第230和231行以执行类似的操作。

您最好让#mpgma #pragma omp parallel for

int **scoreMatrix = malloc(sizeof(int *) * (strlen(seq1)+1));

int i,j = 0;
omp_set_num_threads(6);

#pragma omp parallel for private(i,j) 
for(i = 0; i < strlen(seq1)+1; ++i){
    scoreMatrix[i] = malloc(sizeof(int) * (strlen(seq2)+1));
    for(j = 0; j < strlen(seq2)+1; ++j){
        scoreMatrix[i][j] = 0;
    }
}

这可能会产生影响,具体取决于openmp处理线程占用的程度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM