- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有这段代码:
#include <omp.h>
#include <stdio.h>
int main(){
int i,j = 0 ;
int tid;
# pragma omp parallel private(i,j,tid)
{
tid = omp_get_thread_num();
printf("Thread %d\n",tid);
for(i=0;i<10;i++){
# pragma omp for
for(j=0; j<10;j++){
tid = omp_get_thread_num();
printf("(i,j) = (%d,%d) Thread %d\n",i,j,tid);
}
}
}
return 0;
}
为什么第一个“printf”被每个线程执行而不是第二个?
最佳答案
“omp parallel”启动一个 parallel region .当线程进入该区域时,通常会启动一组线程,进入的线程将成为主线程。然后,团队中的所有线程都执行代码,直到并行区域结束,线程在并行区域重新加入主线程。
因为 omp parallel 启动了一个并行区域,这就是像你的 private(i,j,tid)
go 子句这样的子句,它定义了如何在区域内处理变量(默认、私有(private)、 shared、reduction 等)在并行区域开始时给出,连同可选择设置线程数 (num_threads) 的子句。
但通常让多个线程在并行区域中执行完全相同的步骤并不是您想要的;您希望每个线程执行不同的任务,或者处理某个问题的单独部分。因此 OpenMP 有 worksharing constructs ,包括“omp for”。在 OpenMP for 的情况下,循环迭代在线程之间拆分,因此只有一个线程获得循环的每个迭代。 (为了让它起作用,循环本身有条件。)设置 for 循环如何在线程之间分解的子句 - (schedule, collapse) 放在这里,以及对迭代如何执行(排序)的限制,以及一些关于如何在 for 循环中处理变量的子句。 C 中工作共享构造的其他示例是单一的 - 只有一个线程执行工作 - 任务和部分。
所以所有线程都执行第一个printf语句,因为队内所有线程都命中了它。但是 for 循环迭代在线程之间被拆分,每个 j 只被一个线程打印出来。
如果在并行区域开始和 for 循环开始之间不需要任何代码,可以将这两个指令组合为“omp parallel for”,它既启动并行区域又拆分(立即)在线程之间进行循环。
关于c - omp for 和 omp parallel 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26389205/
好的,我希望以前没有问过这个问题,因为在搜索中很难找到。 我查看了 F95 手册,但仍然觉得这很模糊: For the simple case of: DO i=0,99 END DO 我正
这两者有什么区别? [一] #pragma omp parallel { #pragma omp for for(int i = 1; i < 100; ++i) {
这两者有什么区别? [一] #pragma omp parallel { #pragma omp for for(int i = 1; i < 100; ++i) {
我有这段代码: #include #include int main(){ int i,j = 0 ; int tid; # pragma omp parallel pri
刚开始接触OPENMP,想用它来求解波动方程,串口代码在这里: #include #include #include #include #define GRID_SZ 3000 #define
我对 omp single 感到困惑和 omp task指令。我已经阅读了几个使用它们的例子。以下示例显示如何使用任务构造来处理链表的元素。 1 #pragma omp parallel 2 {
我试图了解 omp ordered 和 omp critical 之间的区别。他们都没有相同的语义吗?每个线程中编写的代码都被串行执行,当一个线程处于有序/关键 block 中时,其他线程等待。我看不
是否可以在 omp 并行 block 之外使用 omp pragma,如 critical、single、master 或 barrier?我有一个函数可以从 OMP 并行 block 调用,也可以不
我想测试 #pragma omp parallel for 和 #pragma omp simd 一个简单的矩阵加法程序。当我分别使用它们时,我没有收到任何错误,而且看起来还不错。但是,我想测试使用它
考虑: void saxpy_worksharing(float* x, float* y, float a, int N) { #pragma omp parallel for
我试图了解 #pragma omp critical 之间的确切区别和 #pragma omp single在 OpenMP 中: Microsoft 对这些的定义是: Single:让您指定应在其上
在带有 openMP 的 C++ 中,两者之间有什么区别吗 #pragma omp parallel for for(int i=0; i
我正在处理一些事情,试图让孤立工作发挥作用,并通过减少 #pragma omp parallel 的调用来减少开销。我正在尝试的是这样的: #pragma omp parallel default(n
在我学习 OpenMP 的过程中,我遇到了一个示例,其中的主要内容如下所示: int main(){ #pragma omp parallel #pragma omp sing
我是 OpenMP 的新手,我一直在尝试运行一个使用 OpenMP 添加两个数组的程序。在 OpenMP 教程中,我了解到,在 for 循环上使用 OpenMP 时,我们需要使用 #pragma om
我正在阅读 Peter S. Pacheco 的《并行编程简介》一书。在第 5.6.2 节中,它对减少 fork/join 开销进行了有趣的讨论。 考虑奇偶转置排序算法: for(phase=0; p
之间有什么区别: #pragma omp for {for_loop} 和 #pragma omp parallel for {for_loop} 最佳答案 #pragma omp par
在 OpenMP 中 #pragma omp master 中的任何代码指令由单个线程(主线程)执行,在区域末尾没有隐含的屏障。 (见 section on MASTER directive in t
如果我明白 aligned omp simd的条款构造,它指的是整个数组的对齐方式。 它如何用于多维数组?认为 ni = 131; nj = 137; nk = 127 !allocates arr
我有一个问题:我必须使用 OMP 并行化这段代码。 存在数据依赖问题,不知道如何解决。有什么建议么? for (n = 2; n < N+1; n++) { dz = *(dynamic_d +
我是一名优秀的程序员,十分优秀!