OpenMP 矩阵向量乘法仅在一个线程上执行
OpenMP Matrix-Vector Multiplication Executes on Only One Thread
我有这段代码(在下面概述)用于并行化矩阵向量乘法。但是每当我 运行 它时,我发现它只在一个线程上执行(即使我指定了 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]);
}
}
您是否在 #pragma omp parallel{...}
中添加了此代码段,或者您可能遗漏了 parallel
这个词?
您必须指定线程数。您可以使用 OMP_NUM_THREADS 环境变量来完成。
您确定在启用 Openmp 的情况下进行编译吗?如果是这样,您的编译器应该抛出错误,因为您的变量 H
已在包含 private(i, j, H)
子句的并行区域范围内声明。
根据您的编译器,您应该添加相应的 OpenMp 标志,例如 gcc -fopenmp
。
您还可以通过调用 omp_get_num_threads()
.
检查运行时的可用线程数
我有这段代码(在下面概述)用于并行化矩阵向量乘法。但是每当我 运行 它时,我发现它只在一个线程上执行(即使我指定了 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]);
}
}
您是否在 #pragma omp parallel{...}
中添加了此代码段,或者您可能遗漏了 parallel
这个词?
您必须指定线程数。您可以使用 OMP_NUM_THREADS 环境变量来完成。
您确定在启用 Openmp 的情况下进行编译吗?如果是这样,您的编译器应该抛出错误,因为您的变量 H
已在包含 private(i, j, H)
子句的并行区域范围内声明。
根据您的编译器,您应该添加相应的 OpenMp 标志,例如 gcc -fopenmp
。
您还可以通过调用 omp_get_num_threads()
.