[英]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.