精华内容
下载资源
问答
  • 本文对串行程序并行化部分算法研究改进具有一定现实意义,对依赖关系分析别名分析方法研究以及部分程序并行化算法改进具有一定参考价值。针对内存检测计算所面临问题,给出了基于桌面网格数据划分...
  • 考虑到大多数基于SRAM的应用的存储器要求,选择并行接口并不令人惊讶。对于已经(仍在)使用SRAM的高性能(主要是缓存)应用而言,与串行接口相比,并行接口拥有明显优势。但这种情况似乎即将改变。  尽管能够...
  • 考虑到大多数基于SRAM的应用的存储器要求,选择并行接口并不令人惊讶。对于已经(仍在)使用SRAM的高性能(主要是缓存)应用而言,与串行接口相比,并行接口拥有明显优势。但这种情况似乎即将改变。  尽管能够...
  • 作者 | 仿真小助手首发 | 仿真秀公众号(ID:fangzhenxiu2018)Fluent中用户自定义函数(user defined function)UDF功能是非常强大灵活技术,它可以帮助流体工程师实现很多标准界面...图1 UDF技术可以应用在Fluent仿...

    c133f3ef5f4282606342dc27176f0591.gif

    作者 | 仿真小助手 

    首发 | 仿真秀公众号(ID:fangzhenxiu2018)

    Fluent中的用户自定义函数(user defined function)UDF功能是非常强大灵活的技术,它可以帮助流体工程师实现很多标准界面之外的功能;而且,用户还可以依托UDF技术对Fluent中的算例进行不同程度的二次开发,从而有效提升实际仿真的工作效率。

    e675e37cc4eb6d0e2197ee5054539c5a.png

    图1  UDF技术可以应用在Fluent仿真的各个环节之中

    一、为什么Fluent工程师需要掌握UDF技术

    一位流体仿真的前辈曾经说过:“无论你在哪个行业、哪种产品上使用Fluent进行仿真分析,几乎都离不开UDF。因为标准界面中的内容限制过多,无法满足真实产品设计过程中的多样化需求。

    如果一个Fluent工程师无法熟练应用UDF技术,那么就好比是一个长不大的小孩子一样,只能按照大人给的规则进行思考和生活;只有掌握了UDF技术,才能有自己的主见,把独立的想法体现在仿真之中;这样,才能真正的成为一名成熟的流体工程师。”

    698e20da3cf14a60ca126910f73e040a.png

    图2  Fluent工程师的成长过程与UDF

    当然,我们可能无法找到这段话的真实出处,也不敢完全赞同其中的观点,但它说明的道理却是显而易见的,也从一个侧面说明了UDF的重要性。在实际的工作中,UDF技术广泛应用在复杂的Fluent真实案例中,通常包括以下几个方面的内容:

    • 定制边界条件,源项,反应速率,材料属性等

    • 定制自定义的物理模型,或直接描述用户提供的模型方程

    • 定于求解过程中的调整函数

    • 根据不同的需求执行相应的函数

    • 自定义在初始化过程中的个性化设置

    举一个简单的例子,很多流体仿真中的材料属性是相对复杂的,比如材料的粘性,它和温度、压力、速度等变量都有相对复杂的函数关系。对于这一类情况,通常的Fluent标准界面可能就无法准确描述这种复杂的关系,此时,就必须要请出UDF来帮忙才能完成我们的需求。

    二、为什么要掌握并行UDF技术1、并行UDF代码和串行有区别

    由于Fluent的求解进程在并行与串行的架构下有较大区别,因此UDF在执行的过程中也会表现出完全不一样的状态。通常我们学习UDF的课程都是基于串行代码展开的,但是大多数内容对于并行UDF都是不可用的。实际上,并行UDF的代码在相当一部分问题中需要额外的规则才能顺利、准确的执行下去。

    1e671c5bda1bdafe7fa5343a5cfad7b5.png

    图3  使用4核并行仿真的求解架构

    2、计算机硬件技术发展迅猛

    随着全世界经济的飞速发展,计算机硬件的更新换代也得到了明显的提升。对于Fluent仿真来讲,最为重要的就是CPU的性能,因为它关系着求解计算的速度快慢。

    目前顶级的英特尔至强处理器(E5-26xx)单个CPU就可以具备6核12线程(3.4G)或者18核36线程(2.3G)的能力,运算的速度对比5年前已有了数倍甚至数十倍的提高。而且,这些强大的多核CPU已经逐渐的配备到了各类移动工作站(笔记本)中,使得我们的仿真工作更加灵活,更加高效。

    7653ba0f5759f152e88bd56b15146b03.png

    推荐大家学习张晓荣老师发布在仿真秀APP的视频教程

    因此,我们有理由相信任何一个流体工程师,都不会在如此强大的多核CPU上,使用串行方法来计算我们的Fluent仿真案例。因此,并行技术借助硬件的发展,已经成为流体仿真的必要(唯一)手段。

    679032677436325d0b505e115e2f2992.png

    图4一些主流CPU的性能指标

    3、算例更加精细,网格数量更多

    硬件提升了,对应能够支持的网格数量也就随之增加,这也是近年来流体仿真取得突破性进展的坚实基础。如果时间倒退回十五年前,那么使用串行计算一个Fluent案例,将是一件非常正常的事情;但是对于眼下的仿真行业,已经无法再找到不使用并行计算的情况了。

    Fluent仿真经过数十年的发展,很多行业已经不满足于使用相对粗糙的网格进行概略的求解,相反,更多的人希望各通过更加准确的几何细节,和更加精细的物理模型进行详细计算,从而得到更加完整、细致、精准的仿真结果。大规模的计算需要硬件的支持,也离不开并行技术的保障。

    实际上,当流体仿真的网格数量超过10万时,并行计算的优势就已经可以很好的体现出来了,尤其是当一个核数对应5-8万个(六面体)体网格时,并行加速的效果是非常明显的。

    e32f50069ed33496fc315a15d9e8d5c7.png

    图5 Fluent 使用13万核并行计算的超大规模燃烧问题加速比

    4、Fluent中完美的并行技术

    Fluent软件在并行的过程中,具备非常严谨的求解进程,既能充分调用已有的CPU资源,又能很好的保证计算结果的准确性,这是Fluent本身的优势,也是Fluent多年发展的成果。

    可以豪不夸张的讲,Fluent具备有完美的并行能力,从任何一个角度来看都很难找到缺陷,这是其他有限元软件(至少在并行计算层面上)所无法企及的高度。因此,我们要更加珍惜Fluent的这一长处,更好的利用他,帮助我们完成仿真的任务。

    值得一提的是,在Fluent  R18.1之后的版本中,串行计算已经成为一个“遗留概念”;Fluent的求解架构已经完全按照并行的进程来开展工作了,即使我们选择了Serial(串行),Fluent仍旧会把算例当成1个核心的并行进行计算,从这个角度来讲,串行的UDF代码在18.1之后就退出了历史舞台,无论何种情况下,我们都必须使用并行UDF代码。

    e43402b9962540fbd58068b5ff7d6575.png

    图6 串行问题在高版本的Fluent中仍旧按照并行架构进行求解

    悄悄分享一个小秘密:18.1版本仍旧可以正确读取串行的UDF代码,但仅限紧急情况下使用。方法是:并行(Parallel)核数设置成0。

    三、Fluent并行UDF代码中需要注意的问题

    首先需要明确的是,并行与串行的区别仅存在于代码之中,其他的UDF环节(如编译、解释、管理、与算例hook等)则不存在任何差别。因此,我们在已经具备的串行UDF技能基础之上,仅考虑以下四个方面的差异,即可满足并行需求:

    1、并行专用的编译器指令

    由于并行求解中需要区分主节点和子节点分别书写代码,因此必须要使用一些预处理的命令来判别使用的环境。当我们的代码中含有这一类指令时,读入主节点和子节点的代码会有很大的区别。

    b9bcbe248e85daece83a6c5921b665f0.png

    图7  并行专用的编译器指令

    2、区分内部(internal)和外部(external)单元(cell)与面(face)的循环

    并行计算必须首先对网格进行分区,这样才能提高整体的工作效率。分区结束后,通常在分区的交界处会出现一些特别的单元(cell)和面(face)。基于串行代码的循环宏在处理这一类分区交界单元(面)时可能会出现错误,但这些错误在串行问题中则不会发生,因此,必须要在并行UDF中对这一类单元(面)进行特殊的处理,从而避免循环过程中的错误。

    dd887eff0203359282427d4f13e62e82.png

    图8  并行计算中分区的网格分类

    3、全局变量(数据)缩减(变量一致性处理)

    当多核并行计算时,一些全局变量(如平均速度等)在各个分区的网格中有不同的值,这就需要我们进行全局的数据统一。并行UDF在处理这一类问题中有专用的代码,可以较为轻松的实现全局变量(数据)的规模缩减和同步。

    4、子节点与主节点之间的数据传输 

    根据并行仿真的架构,网格的变量数据并不包含在主节点中,通过TUI输入的值也不能直接被子节点获得,此时,就必须要通过代码来实现数据的传递,这样才能使代码中的一些功能得以有效实现。
    由于篇幅所限,关于UDF并行计算的详细内容无法全部展示在文章之中,如果大家感兴趣,可以关注仿真秀平台,里面有更为详细的功能讲解与介绍,同时还会有实际的并行UDF案例操作与演示。

    最后:对UDF感兴趣的小伙伴,请分享本文到朋友圈截图发到仿真秀公众号,然后回复 我要模型  立即分享您一个下6月10日(周一20:00)我在仿真秀直播间首播的《Fluent中级工程仿真案例操作讲解8讲》第二课《UDF-并行计算中用户自定义函数介绍及案例操作》全部源文件

    福利:学生用户请联系仿真小助手 领取系列通票,限50张,非学生用户,也可以领取10张体验票,送完即止。

    方法:在仿真秀公众号对话框 回复 小助手  即可。

    72f87cb2511646649082432af7f99ee7.png

    最后,让我们来感受一下讲课嘉宾的风格吧!欢迎点击文尾订阅免费试听。

    作者:张杨,仿真秀专栏作者

    声明:原创文章,首发仿真秀公众号(ID:fangzhenxiu2018),部分图片源自网络,如有不当请联系我们,欢迎分享,禁止私自转载,转载请联系我们。

    f3627cc74b266e6e2f290da32572e4a4.png

    展开全文
  • (一)远程站设置: 最简单做法是在远程机器专为拨号连接建立PPP 登陆项: ppp:off:700:700:ppp acount:/home/ppp:home/ppp/ppplogin 为账号建立起始目录; # mkdir /home/ppp # chown ppp. /home/ppp...

     (一)远程站的设置:

    最简单的做法是在远程的机器专为拨号连接建立PPP 登陆项 :

       ppp:off:700:700:ppp acount:/home/ppp:home/ppp/ppplogin

     

     为账号建立起始目录;

         # mkdir   /home/ppp

         #  chown  ppp. /home/ppp

        注意在新加的行中,将下列程序作为登陆的shell:

         /home/ppp/ppplogin

        实际上,它不是shell程序。而是在远程机上用来启动pppd守护程序的script.

     它的典型形式如下:

          # !/bin/sh

          exec   /usr/sbin/pppd  38400 modem  asyncmap 0 proxyarp  194.61.21.2:194.61.21.49

     

           modem 参数规定:本地端挂断电话时,pppd应该用RS232接口的调制解调器控制线彻底断开链路。

           asyncmap 0:取决于对远程机的串行连接,连接可能将ASCII控制码(0~31)用于特殊用途。

          

      TCP/IP网络的以太网并不直接利用IP地址,而是利用以太网硬件地址来传递数据

    包。将IP地址转换为以太网硬件地址的协议称为地址解析协议。

     

     

        (二)本地站设置:

       (1):写一个shell script,用在本地机器上运行pppd守护程序,然后,通过调制解调器接通远程机,并登陆到PPP账号。

           方法: 使用pppd和拨号程序chat,从linux发布安装ppp软件包时,pppd和char以及其他有用的程序和script一起自东被装入.

           连接远程机的脚本:

               /usr/sbin/pppd connect '/usr/sbin/chat""ATDT334566

              CONNECT" "'ogin:ppp word:PA55word' /dev/modem 38400

             modem defaultroute  ip  194.61.21.49;194.61.21.233

     

     

     

     

     

       

      

     

    转载于:https://www.cnblogs.com/cliuwei/p/4746293.html

    展开全文
  • RabbitMq09——confirm串行和并行模式

    千次阅读 2018-07-12 23:53:46
    之前我们确定一个消息是否发送成功是从消费者是否接收到来判断,但是在实际应用中,消费者生产者往往是分开部署,我们也不可能每发送一条消息就去消费者那里确认一下,所有我们需要一个机制来确认消息发送后...

    之前我们确定一个消息是否发送成功是从消费者是否接收到来判断的,但是在实际应用中,消费者和生产者往往是分开部署的,我们也不可能每发送一条消息就去消费者那里确认一下,所有我们需要一个机制来确认消息发送后是否成功到达了消息队列,下面来介绍几种在生产者端来确认消息发送状态的方法。(本篇及上一篇事务模式)

    confirm串行模式

    生产者

    package com.mmr.rabbitmq.confirm01;
    
    import com.mmr.rabbitmq.util.ConnectionUtils;
    import com.rabbitmq.client.Channel;
    import com.rabbitmq.client.Connection;
    
    public class Send {
    	
    	private static final String QUEUE_NAME="QUEUE_confirm";//定义队列名
    
    	public static void main(String[] args) throws Exception
    	{
    		Connection connection = ConnectionUtils.getConnection();
    		
    		Channel channel = connection.createChannel();//获取一个信道
    		
    		channel.queueDeclare(QUEUE_NAME, false, false, false, null);
    		
    		channel.confirmSelect(); //将信道设置成confirm模式
    		String msg="Hello confirm QUEUE !";
    		
    		//可使用循环发送多条消息
    		for (int i = 0; i < 10; i++) {
    			channel.basicPublish("", QUEUE_NAME, null, msg.getBytes());
    		
    			System.out.println("---------send ms :"+msg);
    		}
    		
    		//调用方法确认消息是否发送成功
    		//如果在发送多条消息后调用该方法为批量处理操作,即确认调用该方法之前的所有消息的状态
    		//批量确认时,如果有一条消息发送失败,则此批量所有消息都失败
    		if(channel.waitForConfirms())
    		{
    			System.out.println("发送成功");
    		}else{
    			System.out.println("发送失败!!!!!!!");
    		}
    		
    		channel.close();
    		connection.close();
    	}
    
    }
    

    消费者

    package com.mmr.rabbitmq.confirm01;
    
    import java.io.IOException;
    
    import com.mmr.rabbitmq.util.ConnectionUtils;
    import com.rabbitmq.client.AMQP.BasicProperties;
    import com.rabbitmq.client.Channel;
    import com.rabbitmq.client.Connection;
    import com.rabbitmq.client.DefaultConsumer;
    import com.rabbitmq.client.Envelope;
    
    public class Recv {
    	
    	private static final String QUEUE_NAME="QUEUE_confirm";	
    	
    	public static void main(String[] args) throws Exception {
    		
    		Connection connection = ConnectionUtils.getConnection();
    		Channel channel = connection.createChannel();
    		
    		channel.queueDeclare(QUEUE_NAME, false, false, false, null);
    		
    		//定义一个默认的xiaoeiz
    		DefaultConsumer consumer = new DefaultConsumer(channel){
    
    			@Override
    			public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
    					throws IOException {
    				String msg = new String(body, "utf-8");
    				System.out.println("Rev--->" + msg);
    				try {
    					Thread.sleep(5000);
    				} catch (InterruptedException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    			}
    		};
    		
    		channel.basicConsume(QUEUE_NAME, true, consumer);
    		
    	}
    
    }
    

    confirm并行模式

    生产者

    package com.mmr.rabbitmq.confirm02;
    
    import java.io.IOException;
    import java.util.Collections;
    import java.util.SortedSet;
    import java.util.TreeSet;
    
    import com.mmr.rabbitmq.util.ConnectionUtils;
    import com.rabbitmq.client.Channel;
    import com.rabbitmq.client.ConfirmListener;
    import com.rabbitmq.client.Connection;
    
    public class Send {
    	
    	private static final String QUEUE_NAME="QUEUE_confirm_bing";//定义队列名
    
    	public static void main(String[] args) throws Exception
    	{
    		Connection connection = ConnectionUtils.getConnection();
    		
    		Channel channel = connection.createChannel();//获取一个信道
    		
    		channel.queueDeclare(QUEUE_NAME, false, false, false, null);
    		
    		//存放已发送消息的唯一标识
    		final SortedSet<Long>  confirmSet = Collections.synchronizedSortedSet(new TreeSet<Long>());
    		
    		channel.confirmSelect(); //将信道设置成confirm模式
    		String msg="Hello confirm QUEUE !";
    		
    		//获取下次发送消息的标识
    		Long num = channel.getNextPublishSeqNo();
    		channel.basicPublish("", QUEUE_NAME, null, msg.getBytes());
    		
    		//每发送一条消息向集合中添加一条
    		confirmSet.add(num);
    		
    		System.out.println("---------send ms :" + msg);
    		System.out.println("the only num is::::: :" + num);
    			
    		channel.addConfirmListener(new ConfirmListener()
    		{
    			//消息发送失败时回调的方法
    			//deliveryTag 消息的表示,每条消息都是独一无二的
    			//multiple 返回确认的消息是多条还是一条,true为多条
    			public void handleNack(long deliveryTag, boolean multiple) throws IOException
    			{
    				System.out.println("消息发送成功了!!!!!!!!");
    				if(multiple){
    					System.out.println("multiple is --------->" + multiple);
    					System.out.println("deliveryTag is --------->" + deliveryTag);
    					confirmSet.headSet(deliveryTag + 1).clear();
    				}else{
    					System.out.println("multiple is --------->" + multiple);
    					System.out.println("deliveryTag is --------->" + deliveryTag);
    					confirmSet.remove(deliveryTag);
    				}
    				
    			}
    			
    			//消息发送成功时回调的方法
    			public void handleAck(long deliveryTag, boolean multiple) throws IOException
    			{
    				System.out.println("消息发送失败了!!!!!!!!");
    				if(multiple){
    					System.out.println("multiple is --------->" + multiple);
    					System.out.println("deliveryTag is --------->" + deliveryTag);
    					confirmSet.headSet(deliveryTag + 1).clear();
    				}else{
    					System.out.println("multiple is --------->" + multiple);
    					System.out.println("deliveryTag is --------->" + deliveryTag);
    					confirmSet.remove(deliveryTag);
    				}
    				
    			}
    		});
    		
    	}
    
    }
    

    消费者与串行模式相同,只需更改队列名即可。

    扫码关注公众号“魔性JAVA”,免费领取超实用软件开发资料视频(包括大数据,前端完整视频,maven教程视频,java面试必备视频教程,Java并发视频教程)

    该公众号致力于为大家分享工作中会用到一些简单实用的小知识,而不是那些悬在云端的高大上但又感觉空泛的文章,欢迎大家关注,谢谢!

    展开全文
  • Fluent中用户自定义函数(user defined function)UDF功能是非常强大灵活技术,它可以帮助流体...图1 UDF技术可以应用在Fluent仿真各个环节之中一、为什么Fluent工程师需要掌握UDF技术一位流体仿真前辈曾经...

    df356542d5ee57d2365579af95192a68.png

    Fluent中的用户自定义函数(user defined function)UDF功能是非常强大灵活的技术,它可以帮助流体工程师实现很多标准界面之外的功能;而且,用户还可以依托UDF技术对Fluent中的算例进行不同程度的二次开发,从而有效提升实际仿真的工作效率。

    b7db4cf487feb8a4d986aee6035cf601.png

    图1  UDF技术可以应用在Fluent仿真的各个环节之中

    一、为什么Fluent工程师需要掌握UDF技术

    一位流体仿真的前辈曾经说过:“无论你在哪个行业、哪种产品上使用Fluent进行仿真分析,几乎都离不开UDF。因为标准界面中的内容限制过多,无法满足真实产品设计过程中的多样化需求。

    如果一个Fluent工程师无法熟练应用UDF技术,那么就好比是一个长不大的小孩子一样,只能按照大人给的规则进行思考和生活;只有掌握了UDF技术,才能有自己的主见,把独立的想法体现在仿真之中;这样,才能真正的成为一名成熟的流体工程师。”

    baa600dfd199ba59730cc4a9a3dbf074.png

    图2  Fluent工程师的成长过程与UDF

    当然,我们可能无法找到这段话的真实出处,也不敢完全赞同其中的观点,但它说明的道理却是显而易见的,也从一个侧面说明了UDF的重要性。在实际的工作中,UDF技术广泛应用在复杂的Fluent真实案例中,通常包括以下几个方面的内容:

    • 定制边界条件,源项,反应速率,材料属性等

    • 定制自定义的物理模型,或直接描述用户提供的模型方程

    • 定于求解过程中的调整函数

    • 根据不同的需求执行相应的函数

    • 自定义在初始化过程中的个性化设置

    举一个简单的例子,很多流体仿真中的材料属性是相对复杂的,比如材料的粘性,它和温度、压力、速度等变量都有相对复杂的函数关系。对于这一类情况,通常的Fluent标准界面可能就无法准确描述这种复杂的关系,此时,就必须要请出UDF来帮忙才能完成我们的需求。

    二、为什么要掌握并行UDF技术 

    1、并行UDF代码和串行有区别

    由于Fluent的求解进程在并行与串行的架构下有较大区别,因此UDF在执行的过程中也会表现出完全不一样的状态。通常我们学习UDF的课程都是基于串行代码展开的,但是大多数内容对于并行UDF都是不可用的。实际上,并行UDF的代码在相当一部分问题中需要额外的规则才能顺利、准确的执行下去。

    a7abf88f08b96c8bb97c24434abbd4ea.png

    图3  使用4核并行仿真的求解架构

    2、计算机硬件技术发展迅猛

    随着全世界经济的飞速发展,计算机硬件的更新换代也得到了明显的提升。对于Fluent仿真来讲,最为重要的就是CPU的性能,因为它关系着求解计算的速度快慢。

    目前顶级的英特尔至强处理器(E5-26xx)单个CPU就可以具备6核12线程(3.4G)或者18核36线程(2.3G)的能力,运算的速度对比5年前已有了数倍甚至数十倍的提高。而且,这些强大的多核CPU已经逐渐的配备到了各类移动工作站(笔记本)中,使得我们的仿真工作更加灵活,更加高效。

    61c78de66a096eceb22ffb3e2abf670e.png

    因此,我们有理由相信任何一个流体工程师,都不会在如此强大的多核CPU上,使用串行方法来计算我们的Fluent仿真案例。因此,并行技术借助硬件的发展,已经成为流体仿真的必要(唯一)手段。

    3aed44b37a8be22f61f5e8d9626c664e.png

    图4一些主流CPU的性能指标

    3、算例更加精细,网格数量更多

    硬件提升了,对应能够支持的网格数量也就随之增加,这也是近年来流体仿真取得突破性进展的坚实基础。如果时间倒退回十五年前,那么使用串行计算一个Fluent案例,将是一件非常正常的事情;但是对于眼下的仿真行业,已经无法再找到不使用并行计算的情况了。

    Fluent仿真经过数十年的发展,很多行业已经不满足于使用相对粗糙的网格进行概略的求解,相反,更多的人希望各通过更加准确的几何细节,和更加精细的物理模型进行详细计算,从而得到更加完整、细致、精准的仿真结果。大规模的计算需要硬件的支持,也离不开并行技术的保障。

    实际上,当流体仿真的网格数量超过10万时,并行计算的优势就已经可以很好的体现出来了,尤其是当一个核数对应5-8万个(六面体)体网格时,并行加速的效果是非常明显的。

    6993ba5419eb67fbcd6335d49bb4a3d4.png

    图5 Fluent 使用13万核并行计算的超大规模燃烧问题加速比

    4、Fluent中完美的并行技术


    Fluent软件在并行的过程中,具备非常严谨的求解进程,既能充分调用已有的CPU资源,又能很好的保证计算结果的准确性,这是Fluent本身的优势,也是Fluent多年发展的成果。

    可以豪不夸张的讲,Fluent具备有完美的并行能力,从任何一个角度来看都很难找到缺陷,这是其他有限元软件(至少在并行计算层面上)所无法企及的高度。因此,我们要更加珍惜Fluent的这一长处,更好的利用他,帮助我们完成仿真的任务。

    值得一提的是,在Fluent  R18.1之后的版本中,串行计算已经成为一个“遗留概念”;Fluent的求解架构已经完全按照并行的进程来开展工作了,即使我们选择了Serial(串行),Fluent仍旧会把算例当成1个核心的并行进行计算,从这个角度来讲,串行的UDF代码在18.1之后就退出了历史舞台,无论何种情况下,我们都必须使用并行UDF代码。

    6c7078a7db3af91add1a34adaaecbd94.png

    图6 串行问题在高版本的Fluent中仍旧按照并行架构进行求解

    悄悄分享一个小秘密:18.1版本仍旧可以正确读取串行的UDF代码,但仅限紧急情况下使用。方法是:并行(Parallel)核数设置成0。

    三、Fluent并行UDF代码中需要注意的问题

    首先需要明确的是,并行与串行的区别仅存在于代码之中,其他的UDF环节(如编译、解释、管理、与算例hook等)则不存在任何差别。因此,我们在已经具备的串行UDF技能基础之上,仅考虑以下四个方面的差异,即可满足并行需求:

    1、并行专用的编译器指令

    由于并行求解中需要区分主节点和子节点分别书写代码,因此必须要使用一些预处理的命令来判别使用的环境。当我们的代码中含有这一类指令时,读入主节点和子节点的代码会有很大的区别。

    e8d4c2ea5414e2a27c24cbf2eea8fe05.png

    图7  并行专用的编译器指令

    2、区分内部(internal)和外部(external)单元(cell)与面(face)的循环

    并行计算必须首先对网格进行分区,这样才能提高整体的工作效率。分区结束后,通常在分区的交界处会出现一些特别的单元(cell)和面(face)。基于串行代码的循环宏在处理这一类分区交界单元(面)时可能会出现错误,但这些错误在串行问题中则不会发生,因此,必须要在并行UDF中对这一类单元(面)进行特殊的处理,从而避免循环过程中的错误。

    365b66c7485dce25189f04e963de3322.png

    图8  并行计算中分区的网格分类

    3、全局变量(数据)缩减(变量一致性处理)

    当多核并行计算时,一些全局变量(如平均速度等)在各个分区的网格中有不同的值,这就需要我们进行全局的数据统一。并行UDF在处理这一类问题中有专用的代码,可以较为轻松的实现全局变量(数据)的规模缩减和同步。

    4、子节点与主节点之间的数据传输 

    根据并行仿真的架构,网格的变量数据并不包含在主节点中,通过TUI输入的值也不能直接被子节点获得,此时,就必须要通过代码来实现数据的传递,这样才能使代码中的一些功能得以有效实现。

    来源:仿真秀微信公众号,作者:张杨。版权归作者所有,旨在分享。

    延伸阅读:

    1、如何利用Twinmesh和CFX来模拟涡旋真空泵?(文末有福利)

    2、详解FLUENT嵌套网格

    3、干货 | Fluent嵌套网格技术应用

    4、Fluent与Structure单向瞬态耦合流程的实现

    5、FLUENT对液面晃动的仿真分析

    6、流体仿真前处理,Fluent工程师的”基本功”

    555b18fb932a9a1c4071c9ae5b637ace.png

    b8a55930e0884c3370abb8da82b0a378.png

    展开全文
  • 考虑到大多数基于SRAM的应用的存储器要求,选择并行接口并不令人惊讶。对于已经(仍在)使用SRAM的高性能(主要是缓存)应用而言,与串行接口相比,并行接口拥有明显优势。但这种情况似乎即将改变。
  • 74HC595 - 串行并行

    2020-07-14 17:44:36
    1、串行并行 引脚图 逻辑框图 2、功能注释 芯片主要分为移位寄存器锁存寄存器两大部分。移位寄存器存储串行输入数据,锁存寄存器锁存移位寄存器内数据。 1)SHIFT CLOCK:移位时钟输入引脚,上升沿将...
  • 摘要:串行和并行接口模式是A/D转换器诸多分类中一种,但却是应用中器件选择一个重要指标。在同样转换分辨率及转换速度前提下,不同接口方式不但影响了电路结构,更重要是将在高速数据采集过程中对...
  • 摘要:串行和并行接口模式是A/D转换器诸多分类中一种,但却是应用中器件选择一个重要指标。在同样转换分辨率及转换速度前提下,不同接口方式不但影响了电路结构,更重要是将在高速数据采集过程中对...
  • A Two-Speed, Radix-4, Serial–Parallel Multiplier摘要本文提出了一种用于加速数字滤波、CNN等应用的双速、基4、串行-并行乘法器,它是 Booth4乘法器一种变体,加入了串行-并行修改。通过只加非零Booth编码来跳...
  • 该收集器会在工作时冻结所有应用程序线程,这使它在所有目的用途上都无法在服务器环境中使用。 并行收集器 在停止用户线程之后,多条GC线程并行进行垃圾回收 这里画3条线程只是一个概念,具体几条线程还是看情况...
  • 串行测试 并行测试 随着技术进步,随着组织从手动测试转向Selenium测试自动化 ,测试... 有些人不愿在Selenium中实施并行测试,而另一些人则不愿这样做,因为它们Web应用程序足够小,可以由当前版本窗口进行...
  • 串行总线和并行总线、单工、半双工、全工 1、 随着现代处理器技术发展,并行总线传输速率已不能满足应用(受限于 位宽和信号同步,所有信号线共用一个时钟,所以信号与时钟很难做到同步),故产生串行总线...
  • 并行和串行通信

    千次阅读 2009-04-29 12:08:00
    并行通信在计算机内部总线以及并行口通信中己得到广泛的应用串行通信是指数据以串行方式在一条信道上传输,如图2-3所示。由于计算机内部都采用串行通信,因此,数据在发送之前,要将计算机中的字
  • 串行口扩展并行输... 掌握利用串行移位寄存器扩展并行接口方法 二、实验内容 打开ISIS 7 Professional,参照图8.1设计仿真电路原理图 编写程序实现: (1)用查询TI方式,在7段BCD数码管显示器上循环显...
  • 学过计算机体系结构人可能都知道串行通信和并行通信,可是像我这样学而不精人来说,之前却没有搞懂两者之间关系。 直觉上看,并行肯定比串行快,因为并行是多个数据位可以同时通过独立线路传输,而串行是...
  • 比如:你程序为了更好利用CPU计算资源,开了多线程,CPU整体利用率达到70-90%,现在再用halcon算子的并行计算方式话,CPU占用率可能就会到100%,如果有其他应用在进行话,其他应用就相当于“卡”住了。...
  • A Two-Speed, Radix-4, Serial–Parallel Multiplier摘要本文提出了一种用于加速数字滤波、CNN等应用的双速、基4、串行-并行乘法器,它是 Booth4乘法器一种变体,加入了串行-并行修改。通过只加非零Booth编码来跳...
  • (1)GCD实现同步异步、串行并行。 ——同步sync应用场景:用户登录,利用阻塞 ——串行异步应用场景:下载等耗时间任务 /** * 因为是异步,所以开通了子线程,但是因为是串行队列,所以只需要开通1个子...
  • 微处理器中常用集成串行总线是通用异步接收器传输总线(UART)、串行通信接口(SCI)通用串行总线(USB)等,这些总线在速度、物理接口要求通信方法学上都...目前流行通信一般采用串行并行模式,而串行模式应用
  • 介绍了数字串行加法器的原理,说明了该加法器在FPGA上的实现要点及其在匹配滤波器设计中的应用。  关键词:加法器 位并行 数字串行 FPGA 匹配滤波器 与传统DSP相比,定制DSP具有速度更高、设计灵活、易于...
  • 并行数据转换为串行数据转换器

    万次阅读 2017-07-24 12:04:16
    这篇文章写一下今天早上设计的并行数据到串行数据的转换器,也算是对并行总线和串行总线一个小小的应用,编码过程中也用到了task。 该转换器主要实现的功能是: 1、把并行地址存入寄存器 2、把并行数据存入寄存器 3...
  • CC2530的串行接口原理与应用

    万次阅读 2018-03-28 12:42:09
    网址:https://www.cnblogs.com/ALittleBee/p/7094794.html一、并行通信与串行通信 微控制器与外设之间数据通信,根据连线结构传送方式不同,可以分为两种:并行通信和串行通信。 并行通信:指数据各位...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,546
精华内容 618
关键字:

串行和并行的应用