OpenMP #pragma omp parallel for并行化小探究

今天用了一下openmp,本人表示非常喜欢openmp的傻瓜化模式,导入一个头文件

直接parallel for

#include <iostream>
#include <omp.h>

using namespace std;

int main()
{
    //cout<<"Thread num == "<<omp_get_thread_num()<<endl;

    #pragma omp parallel for num_threads(4)
    for (int i=0;i<4;i++)
    {
        for (int j=0;j<4;j++)
        {
            printf("(%d,%d)",i,j);
            cout<<" Thread num == "<<omp_get_thread_num()<<endl;
        }
    }
}

可以看出这个编译指导语句中的for是只对这句下一个for有用

用大括号

#include <iostream>
#include <omp.h>

using namespace std;

int main()
{
    //cout<<"Thread num == "<<omp_get_thread_num()<<endl;

    #pragma omp parallel num_threads(4)
    {
        for (int i=0;i<4;i++)
        {
            for (int j=0;j<4;j++)
            {
                printf("(%d,%d)",i,j);
                cout<<" Thread num == "<<omp_get_thread_num()<<endl;
            }
        }
    }
}

可以看出是所有4*4的循环完全打乱的情况

over~~~~~~

时间: 2024-08-25 14:30:27

OpenMP #pragma omp parallel for并行化小探究的相关文章

《C++ AMP:用Visual C++加速大规模并行计算》——1.2 CPU并行技术

1.2 CPU并行技术 C++ AMP:用Visual C++加速大规模并行计算 减少应用程序串行部分耗时的一种方法是尽量降低其串行性,重新设计应用程序,充分利用CPU并行和GPU并行.虽然GPU可以同时拥有成千上万个线程,而CPU要少得多,但利用CPU的并行性也能对整体加速比有所帮助.理想情况下,CPU并行技术和GPU并行技术是兼容的,方法也有很多. 1.2.1 向量化 SIMD是一种能使处理速度变得更快的重要方法,也即单指令流多数据流(Single Instruction, Multiple

OpenMP并行化实例----Mandelbrot集合并行化计算

在理想情况下,编译器使用自动并行化能够管理一切事务,使用OpenMP指令的一个优点是将并行性和算法分离,阅读代码时候无需考虑并行化是如何实现的.当然for循环是可以并行化处理的天然材料,满足一些约束的for循环可以方便的使用OpenMP进行傻瓜化的并行. 为了使用自动并行化对Mandelbrot集合进行计算,必须对代码进行内联:书中首次使用自动并行化时候,通过性能分析发现工作在线程中并未平均分配. #include <stdio.h> #include <malloc.h> #de

OpenMP框架入门

OpenMP 框架是使用 C.C++ 和 Fortran 进行并发编程的一种强大方法.GNU Compiler Collection (GCC) V4.2 支持 OpenMP 2.5 标准,而 GCC 4.4 支持最新的 OpenMP 3 标准.包括 Microsoft? Visual Studio 在内的其他编译器也支持 OpenMP.在本文中,您可以学习使用 OpenMP 编译指示 (pragma),寻找对 OpenMP 提供的一些应用程序编程接口 (API) 的 支持,并使用一些并行算法对

OpenMP 线程同步之临界区

多核/多线程编程中肯定会用到同步互斥操作.除了互斥变量以为,就是临界区. 临界区是指在用一时刻只允许一个线程执行的一段用{...},包围的代码段. 在OpenMP中临界区声明方法如下: #pragma omp critical [(name)] //[]表示名字可选 { //需要同一时刻只能有一个线程访问的代码 } 如下面的代码: #include <stdio.h> #include <omp.h> int main() { int sum = 0; #pragma omp pa

简述OpenMP中的线程任务调度

OpenMP中任务调度主要针对并行的for循环,当循环中每次迭代的计算量不相等时,如果简单地给各个线程分配相同次数的迭代,则可能会造成各个线程计算负载的不平衡,影响程序的整体性能. 如下面的代码中,如果每个线程执行的任务数量平均分配,有的线程会结束早,有的线程结束晚: #include<stdio.h> #include<omp.h> int main(){ int a[100][100] = {0}; #pragma omp parallel for for (int i =0;

OpenMP基础----以图像处理中的问题为例

    OpenMP2.5规范中,对于可以多线程执行的循环有如下5点约束: 1.循环语句中的循环变量必须是有符号整形,如果是无符号整形就无法使用,OpenMP3.0中取消了这个约束 2.循环语句中的比较操作必须是这样的样式:loop_variable <,<=,>,>=loop_invariant_interger 3.循环语句中必须是整数加,整数减,加减的数值必须是循环不变量 4.如果比较操作是<,<=,那么循环变量的值在每次迭代时候必须增加,反之亦然 5.循环必须是

多线程-为何使用openmp对程序进行加速,但效果并不理想

问题描述 为何使用openmp对程序进行加速,但效果并不理想 我需要多次(约30万次)对一个较大的矩阵(88147乘以2000)进行计算,而计算过程并不复杂,只是简单的将整个矩阵遍历一遍,做一些小的计算. 这30万次计算中的每一次都是基于上一次的计算结果. 我在一台32核的服务器上跑这个程序,因为计算一次的时间较长(约10分钟),30万次所需的时间太长,因此我想使用openmp来加速它,因为第一次使用openmp,我简单的使用了"for"来对for循环加速,下面是我的代码,openmp

如何在C++代码中使用OpenMP特性

OpenMP 框架是使用 C++.C++ 和 http://www.aliyun.com/zixun/aggregation/29818.html">Fortran 进行并发编程的一种强大方法.GNU Compiler Collection (GCC) V4.2 支持 OpenMP 2.5 标准,而 GCC 4.4 支持最新的 OpenMP 3 标准.包括 Microsoft® Visual Studio 在内的其他编译器也支持 OpenMP.在本文中,您可以学习使用 OpenMP 编译指

OpenMP 中的线程任务调度

OpenMP中任务调度主要针对并行的for循环,当循环中每次迭代的计算量不相等时,如果简单地给各个线程分配相同次数的迭代,则可能会造成各个线程计算负载的不平衡,影响程序的整体性能. 如下面的代码中,如果每个线程执行的任务数量平均分配,有的线程会结束早,有的线程结束晚: 1 #include<stdio.h> 2 #include<omp.h> 3 4 int main(){ 5 int a[100][100] = {0}; 6 #pragma omp parallel for 7