使用openmp创建多个线程
问题描述:
每次尝试打印出threadID
时,无论我在哪里放置打印语句,它总是打印threadId = 0
。它看起来像只有一个线程正在创建,但为什么?我不明白我做错了什么。另外,我检查了并且num_t = 16
。编译时我也确保使用-fopenmp
。使用openmp创建多个线程
omp_set_num_threads(num_t);
#pragma omp parallel shared(a,b,c) private(i,j,k) num_threads(num_t)
{
#pragma omp for schedule(static)
for (int i = 0; i < m; i++)
{
std::cout << omp_get_thread_num()<< "\n";
for (int j = 0; (j < n); j++)
{
c[i + j*m] = 0.0;
for (int k = 0; k < q; k++)
{
c[i+j*m] += a[i*q + k]*b[j*q + k];
}
}
}
}
答
先行先试,我推荐你使用这样的:
#pragma omp parallel for private(...) shared(...) schedule(...) num_threads (X)
其中“X”是要创建的线程数。从理论上讲,前一行必须和你有相似的效果,但是C++有时候会很挑剔(特别是“parallel”子句)
顺便说一句,也许不是你的情况,但要小心使用“文本键” }。根据是否将OpenMP添加到代码块,OpenMP的功能可能会有所不同。
+0
你是什么意思的“文本键”。额外的括号在那里,因为这是在一个函数内。所以在括号外还有一些其他的。 – user678392 2015-02-09 23:04:43
你看过编译器的警告(例如'-Wall')吗?你的编译指示被忽略了吗?为什么在编译指示('\#pragma')之前有反斜杠? 'm'的大小是多少? – 2015-02-09 07:41:26