IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> linux下使用isolcpus与openmp兼容问题 -> 正文阅读

[系统运维]linux下使用isolcpus与openmp兼容问题

1、背景介绍

在linux系统中可以使用isolcpus将操作系统和应用使用的核进行隔离,让操作系统只使用前两个核,具体做法是修改grub.cfg,在内核启动参数中增加

isolcpus=2,3,4,5,6,7,8,9,10,11,12,13

进行设置。?

但是设置完毕后发现无法使用openmp进行并行处理,运行测试程序后,用htop发现只能使用一个核运行。

当把grub.cfg中的isolcpus=2,3,4,5,6,7,8,9,10,11,12,13去掉后,即系统和应用不进行隔离,此时再运行openmp测试程序,发现是正常使用4个核,openmp能正确执行。

测试程序代码如下:

/*
 ============================================================================
 Name        : pthread_test.c
 Author      : 
 Version     :
 Copyright   : Your copyright notice
 Description : Hello World in C, Ansi-style
 ============================================================================
 */

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <semaphore.h>
#include <error.h>
#include <malloc.h>
#include <netdb.h>
#include <netinet/in.h>
#include <assert.h>
#include <fcntl.h>
#include <getopt.h>
#include <stdint.h>
#include <string.h>
#include <time.h>
#include <unistd.h>

#include <sys/stat.h>
#include <sys/types.h>
#include <sys/select.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/mman.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <arpa/inet.h>

#include <sched.h>

int hello1()
{
	int iLoop =0;
	int i = 0;
	cpu_set_t cpu_info;

	pthread_t xdma_t1[5];
	pthread_attr_t attr1[5];

	CPU_ZERO(&cpu_info);

	for(i=3;i<8;i++)
	{
		CPU_SET(i,&cpu_info);
	}

	if( 0 != pthread_setaffinity_np(pthread_self(),sizeof(cpu_set_t),&cpu_info))
	{
		printf("11drvrecv:set affinity failed\n");
	}

#pragma omp parallel num_threads(5)
	{

	}

	while(1)
	{
#pragma omp parallel for num_threads(5)
		for(iLoop = 0;iLoop<=5;iLoop++)
		{
			;
		}

	}


	return 0;
}


void main()
{
	int ret = 0;
	int i = 0;
	cpu_set_t cpu_info;

	pthread_t xdma_t1[5];
	pthread_attr_t attr1[5];


	if(0 != pthread_create(&xdma_t1,NULL,(void*)hello1,NULL) )
	{
		printf("FILE:%s LINE:%d FUNC: CmpDsPCtrl Error!\n",__FILE__,__LINE__);
		return;
	}
	else
	{
		printf("%s %d Cmp: CmpDsPCtrl Started!\n",__FILE__,__LINE__);
	}

	while(1)
	{
		sleep(1);
	}
	return;
}

2、原因分析

在系统中使用了isolcpus会关闭对应的CPU核的migration,也就是run queue迁移,导致程序的线程不会迁移到空闲的核上。所以导致了openmp运行异常。

3、解决办法

查阅资料能发现可以使用OMP_PLACES来解决该问题,链接:https://www.openmp.org/spec-html/5.0/openmpse53.html?

具体做法是在/etc/environment中设置环境变量,改变openmp放线程的策略

OMP_PLACES=cores?

此时即使设置了isolcpus,也可以让openmp正确运行。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-08-30 12:34:54  更:2021-08-30 12:35:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/29 11:05:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计