美文网首页
OpenMP多线程——Parallel for

OpenMP多线程——Parallel for

作者: 侠之大者_7d3f | 来源:发表于2020-10-11 11:32 被阅读0次

多线程——线程同步

数据竞争问题

void test_2(){
    int sum = 0;
    #pragma omp parallel for
    for(int i=0;i<100;i++){
        sum += 1;
        #pragma omp critical
        cout<<"tid:"<<omp_get_thread_num()<<" sum:"<<sum<<endl;
    }
    cout<<"sum:"<<sum<<endl;
}
image.png image.png

线程互斥同步——critical

void test_2(){

    int sum = 0;
    #pragma omp parallel for
    for(int i=0;i<100;i++){
        // 线程互斥同步,保证某一时刻只有1个线程访问操作
        #pragma omp critical
        {
            sum += 1;
            cout<<"tid:"<<omp_get_thread_num()<<" sum:"<<sum<<endl;
        }
        
    }

    cout<<"sum:"<<sum<<endl;

}
image.png

线程互斥同步——atmoic

void test_3(){
    int sum = 0;
    #pragma omp parallel for
    for(int i=0;i<100;i++){
        // 线程互斥同步, 原子操作
        #pragma omp atomic
        sum += 1;
        cout<<"tid:"<<omp_get_thread_num()<<" sum:"<<sum<<endl;
    }

    cout<<"sum:"<<sum<<endl;
}
image.png

线程互斥同步——线程互斥锁函数

void test_4(){
    omp_lock_t lock;            
    omp_init_lock(&lock);   // 初始化创建互斥锁

    int sum = 0;
    #pragma omp parallel for
    for(int i=0;i<100;i++){
        omp_set_lock(&lock);    // 加锁
        sum += 1;
        cout<<"tid:"<<omp_get_thread_num()<<" sum:"<<sum<<endl;
        omp_unset_lock(&lock);  // 解锁
    }

    cout<<"sum:"<<sum<<endl;
    omp_destroy_lock(&lock);    // 销毁线程锁
}
image.png

reduction

void test_5(){

    int a[] = {1, 3, 5, 7, 9};
    int b[] = {0, 2, 4, 6, 8};

    int sum = 0;

    #pragma omp parallel for
    for(int i=0;i<5;i++){
        sum += a[i] + b[i];
        printf("tid:%d %d+%d=%d sum=%d\n", omp_get_thread_num(), a[i], b[i], a[i]+b[i], sum);
    }

    printf("sum=%d\n", sum);
}
image.png image.png
void test_5(){

    int a[] = {1, 3, 5, 7, 9};
    int b[] = {0, 2, 4, 6, 8};

    int sum = 0;

    #pragma omp parallel for reduction(+:sum)
    for(int i=0;i<5;i++){
        sum += a[i] + b[i];
        printf("tid:%d %d+%d=%d sum=%d\n", omp_get_thread_num(), a[i], b[i], a[i]+b[i], sum);
    }

    printf("sum=%d\n", sum);
}
image.png

相关文章

  • OpenMP多线程——Parallel for

    多线程——线程同步 数据竞争问题 线程互斥同步——critical 线程互斥同步——atmoic 线程互斥同步——...

  • Cython:OpenMP配置

    在Cython中使用parallel、prange或者OpenMP时,除了添加/openmp编译参数,还需要将vc...

  • 【OpenMP】parallel for使用多线程进行并行加速

    1.定义 使用parallel指令只是产生了并行域,让多个线程分别执行相同的任务,并没有实际的使用价值。paral...

  • OpenMP Directives

    1. parallel 2.OpenMP Flush 3. num_threads 4.omp_set_dynam...

  • TestNg-09-多线程测试

    TestNg-09-多线程测试1、基于注解 2、基于xml parallel="classs" parallel=...

  • 杂记

    并行计算之OpenMP入门简介 对基于数据分集的多线程程序设计,OpenMP是一个很好的选择。同时,使用OpenM...

  • Chrome

    开启多线程下载chrome://flags/#enable-parallel-downloading

  • ParaFly - 命令行并行(批量)

    简介 ParaFly可以利用多线程程序编译指令(OpenMP)进行简单Unix/linux的并行命令处理,其优点是...

  • 【python】Parallel

    Parallel [TOC] 并行化程序和多线程。一般用thread或者threading,multiproces...

  • 多线程 Windows MSVC OpenMP

    Thread affinity with Windows, MSVC, and OpenMP[https://st...

网友评论

      本文标题:OpenMP多线程——Parallel for

      本文链接:https://www.haomeiwen.com/subject/ysxepktx.html