并行计算:OpenMP(四)——一些函数操作

    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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值