C++ 使用OpenMP的线程数
目前我正在学习并行计算的课程。我想用特定数量的线程运行一个程序,以检查执行时间的差异。我发现一篇类似的帖子很有帮助,但不幸的是,这个解决方案并没有进一步帮助我。 () () 我的程序代码是:C++ 使用OpenMP的线程数,c++,c,parallel-processing,openmp,computer-science,C++,C,Parallel Processing,Openmp,Computer Science,目前我正在学习并行计算的课程。我想用特定数量的线程运行一个程序,以检查执行时间的差异。我发现一篇类似的帖子很有帮助,但不幸的是,这个解决方案并没有进一步帮助我。 () () 我的程序代码是: #define SIZE 1000 main () { float A[SIZE][SIZE], b[SIZE], c[SIZE]; int i, j, n; double fTimeStart, fTimeEnd; /* Initializations */ for
#define SIZE 1000
main ()
{
float A[SIZE][SIZE], b[SIZE], c[SIZE];
int i, j, n;
double fTimeStart, fTimeEnd;
/* Initializations */
for (i=0; i < SIZE; i++)
{
for (j=0; j < SIZE; j++)
/* fminf(x,y) gives the minimum of x and y */
A[i][j] = fminf(i*1.0/(j+1.0),j*1.0/(i+1.0));
b[i] = 1.0 * (i+1);
c[i] = 0.0;
}
fTimeStart = omp_get_wtime();
omp_set_num_threads(4);
#pragma omp for schedule(static)
for (i=0; i < SIZE; i++)
for (j=0; j < SIZE; j++)
c[j] = c[j] + A[j][i] * b[i];
printf("threads: %d\n", omp_get_num_threads());
fTimeEnd = omp_get_wtime();
printf(" wall clock time = %.20f\n", fTimeEnd - fTimeStart);
}
#定义尺寸1000
主要()
{
浮动A[大小][大小]、b[大小]、c[大小];
inti,j,n;
双fTimeStart,fTimeEnd;
/*初始化*/
对于(i=0;i
我假设问题在平行区域
fTimeStart = omp_get_wtime();
{
omp_set_dynamic(0);
omp_set_num_threads(4);
#pragma omp parallel for
for (i=0; i < SIZE; i++)
for (j=0; j < SIZE; j++)
c[j] = c[j] + A[j][i] * b[i];
printf("threads: %d\n", omp_get_num_threads());
}
fTimeEnd = omp_get_wtime();
printf(" wall clock time = %.20f\n", fTimeEnd - fTimeStart);
fTimeStart=omp_get_wtime();
{
omp_集_动态(0);
omp_设置_数量_线程(4);
#pragma-omp并行
对于(i=0;i
程序的线程数输出为1。这很奇怪,因为我试图将其设置为4
问题:为什么程序不在4个线程中执行
编辑:在@igorR的建议之后,将printstatement放入forloop。我也尝试了outerloop,但在重新编译后,我只得到一个print语句,仍然有一个线程
omp_set_dynamic(0);
omp_set_num_threads(4);
#pragma omp parallel for
for (i=0; i < SIZE; i++)
for (j=0; j < SIZE; j++)
c[j] = c[j] + A[j][i] * b[i];
n = omp_get_num_threads();
printf("threads: %d", n);
omp\u set\u动态(0);
omp_设置_数量_线程(4);
#pragma-omp并行
对于(i=0;i
谢谢,
Ter此程序的输出是什么?为什么您认为它不是用4个线程运行的呢?您可以在并行区域打印它。尝试将printf移动到for循环中。在调试器中运行程序。在for循环内设置断点。检查GDB中的线程(
info threads
),您看到了多少线程?请再次阅读代码。它与代码片段不同。代码没有并行性…我鼓励您养成在所有循环和条件的主体上使用大括号的习惯。有关激励示例,请参见。