目录

OpenMP入门

目的

核心

#include <omp.h>
int main() {
#pragma omp parallel
{
#pragma omp for
}
}
#include <stdio.h>
#include <omp.h>
int main(int argc, char** argv) {
    int num_thread = 4;
    omp_set_num_threads(num_thread);    // 设定线程数
#pragma omp parallel num_threads(7)     // 然后改成7线程了
{
    int id = omp_get_thread_num();  // 查询本线程号
    printf("hello from thread%d\n",id);
}
    return 0;
}

for 循环

#pragma omp parallel for
    for (char i = 'a'; i <= 'z'; i++)   // i是循环变量
        std::cout << i << std::endl;    // 可以执行, 但是endl会冲
        fact[i] = i * fact[i-1];    // 不会报错, 但是会出错. 竞态条件
    return 0;
#pragma omp parallel for
    for (int i = 0; i < numElements; i++) {
        array[i] = initValue + i;   // pass
        // array[i] = initValue++;  // error
    }

shared / private 共有和私有数据

    int temp, array[10];
#pragma omp parallel for private(temp) shared(array)
// 其实share(array)不写也没关系
    for (int i = 0; i < 10; i++) {
        temp = array[i];
        array[i] = doSomething(temp);
    }

Reductions 归并

    int sum = 0;
#pragma opm parallel for reduction(+:sum)
    for (int i = 0; i < 100; i++) {
        sum += array[i];
    }

schedule 循环调度

collapse 多层循环 (since openmp 3.0)

#pragma omp parallel for collapse(2)
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 6; j++) {
            workintwocycles(i, j);
        }
        // 层间可以有东西吗?
    }

task 单进程中多线程

avatar

single 仅进行一次

avatar

omp_lock_t 锁

#include <iostream>
#include <omp.h>
static omp_lock_t lock;
int main() {
    omp_init_lock(&lock); //初始化互斥锁
#pragma omp parallel for
    for(int i = 0; i < 5; ++i) {
        omp_set_lock(&lock);   //获得互斥器
        std::cout << omp_get_thread_num() << "+" << std::endl;
        std::cout << omp_get_thread_num() << "-" << std::endl;
        omp_unset_lock(&lock); //释放互斥器
    }
    omp_destroy_lock(&lock);  //销毁互斥器
    return 0;
}

sections 局部并行/串行

#pragma omp parallel sections
{
    {work1();}
#pragma omp section
    {work2();
    work3();}
#pragma omp section
    {work4();}
}

critical 互斥

#pragma omp critical(dataupdate)
{
datastructure.reorganize();
}
#pragma omp critical(dataupdate)
{
datastructure.reorganize_again();
}

atomic 原子性

ordered 保持顺序

barrier 强制同步

master

flush

simd

例子

保留区

参考文献

讨论区