OpenMP 矩阵向量乘法仅在一个线程上执行

Posted

技术标签:

【中文标题】OpenMP 矩阵向量乘法仅在一个线程上执行【英文标题】:OpenMP Matrix-Vector Multiplication Executes on Only One Thread 【发布时间】:2015-06-08 11:33:07 【问题描述】:

我有这段代码(如下所述)用于并行化矩阵向量乘法。但是每当我运行它时,我发现它只在一个线程上执行(即使我指定了 4 个)。如何分离部分并行代码以在单独的线程上运行。任何帮助将不胜感激。谢谢

int nthreads;
nthreads = 4;    
omp_set_num_threads(nthreads);
chunk = m/nthreads;

  #pragma omp parallel for private(i,j,H) schedule(static,chunk)
  for (i=0; i<m; i++ ) 
    C[i]=0;
     for (j=0; j<p; j++) 
       int H = omp_get_thread_num();
       C[i] += (A[i+(j*m)]*B[j]);
                 
     

【问题讨论】:

您能否另外提供mchunk 的电话号码 嗨 @Henkersmann m 是矩阵 A 的行数,比如 20。而块是 (m/number-of-threads),如果我将线程数设置为 4,则为 5 . 我更新了代码以反映这一点。 请注意,schedule(static) 默认的块大小为#iterations / #threads,因此您不必显式提供chunk 【参考方案1】:

您是否在#pragma omp parallel... 中包含了这个sn-p 或者您可能遗漏了parallel 这个词?

【讨论】:

【参考方案2】:

您必须指定线程数。您可以使用 OMP_NUM_THREADS 环境变量来完成。

【讨论】:

【参考方案3】:

您确定要在启用 Openmp 的情况下进行编译吗?如果是这样,您的编译器应该会抛出错误,因为您的变量 H 已在包含 private(i, j, H) 子句的并行区域范围内声明。

根据您的编译器,您应该添加相应的 OpenMp 标志,例如 gcc 的 -fopenmp。 您还可以通过调用omp_get_num_threads() 在运行时检查可用线程的数量。

【讨论】:

以上是关于OpenMP 矩阵向量乘法仅在一个线程上执行的主要内容,如果未能解决你的问题,请参考以下文章

C++ openMP 并行矩阵乘法

OpenMP 矩阵乘法嵌套循环

OpenMP 子句共享与关键

用于矩阵乘法的 OpenMP

C ++ OpenMP在矩阵向量产品上的工作速度非常慢

基于OpenMP的矩阵乘法实现及效率提升分析