OpenMP中提供的函数一般与获取系统信息、上锁相关。
一、线程相关
1.omp_get_num_procs
返回调用函数时可用的处理器数目。
函数原型
int omp_get_num_procs(void)
printf("%d\n", omp_get_num_procs());
2.omp_get_num_threads
返回当前并行区域中的活动线程个数,如果在并行区域外部调用,返回1
函数原型
int omp_get_num_threads(void)
printf("%d\n", omp_get_num_threads());
3.omp_get_thread_num
返回当前的线程号,注意不要和之前的omp_get_num_threads混淆。
函数原型
int omp_get_thread_num(void)
printf("%d\n", omp_get_thread_num());
4.omp_set_num_threads
设置进入并行区域时,将要创建的线程个数
函数原型
int omp_set_num_threads(void)
#include <stdio.h>
#include <omp.h>
int main(int argc, char* argv[])
{
omp_set_num_threads(4);
#pragma omp parallel
{
printf("%d of %d threads\n", omp_get_thread_num(), omp_get_num_threads());
}
return 0;
}
===== OUTPUT =====
0 of 4 threads
1 of 4 threads
3 of 4 threads
2 of 4 threads
5.omp_in_parallel
可以判断当前是否处于并行状态
函数原型
int omp_in_parallel();
printf("%d\n", omp_in_parallel());
输出:1或者0
6.omp_get_max_threads
该函数可以用于获得最大的线程数量,根据OpenMP文档中的规定,这个最大数量是指在不使用num_threads的情况下,OpenMP可以创建的最大线程数量。需要注意的是这个值是确定的,与它是否在并行区域调用没有关系。
printf("%d\n", omp_get_max_threads());
omp_set_num_threads(4);
#pragma omp parallel
{
printf("%d\n", omp_get_max_threads());
}
===== OUTPUT =====
44
4
4
4
4
7.omp_set_dynamic
该函数可以设置是否允许在运行时动态调整并行区域的线程数。
函数原型:
void omp_set_dynamic(int)
当参数为0时,动态调整被禁用。
当参数为非0值时,系统会自动调整线程以最佳利用系统资源。
int i;
omp_set_dynamic(1);
#pragma omp parallel for
for (i = 0; i < 4; i++)
{
printf("%d\n", omp_get_thread_num());
}
8.omp_get_dynamic
该函数可以返回当前程序是否允许在运行时动态调整并行区域的线程数。
函数原型
int omp_get_dynamic()
当返回值为非0时表示允许系统动态调整线程。
当返回值为0时表示不允许。
int i;
printf("%d\n", omp_get_dynamic());
omp_set_dynamic(1);
#pragma omp parallel for
for (i = 0; i < 4; i++)
{
printf("%d\n", omp_get_dynamic());
}
===== OUTPUT =====
0
1
1
1
1
二、锁相关函数
Openmp中有提供一系列函数来进行锁的操作,一般来说常用的函数的下面4个
1.void omp_init_lock(omp_lock) 初始化互斥锁
2.void omp_destroy_lock(omp_lock) 销毁互斥锁
3.void omp_set_lock(omp_lock) 获得互斥锁
4.void omp_unset_lock(omp_lock) 释放互斥锁
#include <stdio.h>
#include <omp.h>
static omp_lock_t lock;
int main(int argc, char* argv[])
{
int i;
omp_init_lock(&lock);
#pragma omp parallel for
for (i = 0; i < 5; ++i)
{
omp_set_lock(&lock);
printf("%d+\n", omp_get_thread_num());
printf("%d-\n", omp_get_thread_num());
omp_unset_lock(&lock);
}
omp_destroy_lock(&lock);
return 0;
}
5.bool omp_test_lock(omp_lock)
除了之前介绍的4个函数之外,与互斥锁的相关的函数还有一个,用来尝试获得锁。
该函数可以看作是omp_set_lock的非阻塞版本。
static omp_lock_t lock;
int main(int argc, char* argv[])
{
int i;
omp_init_lock(&lock);
#pragma omp parallel for
for (i = 0; i < 5; ++i)
{
if (omp_test_lock(&lock))
{
printf("%d+\n", omp_get_thread_num());
printf("%d-\n", omp_get_thread_num());
omp_unset_lock(&lock);
}
else
{
printf("fail to get lock\n");
}
}
omp_destroy_lock(&lock);
return 0;
}