C语言中的MPI编程和多线程有什么区别,MPI编程中针对的是一台电脑多核还是多台电脑谢谢!

C语言中的MPI编程和多线程有什么区别,MPI编程中针对的是一台电脑多核还是多台电脑谢谢!,第1张

MPI(MPI是一个标准,有不同的具体实现,比如MPICH等)是多主机联网协作进行并行计算的工具,当然也可以用于单主机上多核/多CPU的并行计算,不过效率低。它能协调多台主机间的并行计算,因此并行规模上的可伸缩性很强,能在从个人电脑到世界TOP10的超级计算机上使用。缺点是使用进程间通信的方式协调并行计算,这导致并行效率较低、内存开销大、不直观、编程麻烦。OpenMP是针对单主机上多核/多CPU并行计算而设计的工具,换句话说,OpenMP更适合单台计算机共享内存结构上的并行计算。由于使用线程间共享内存的方式协调并行计算,它在多核/多CPU结构上的效率很高、内存开销小、编程语句简洁直观,因此编程容易、编译器实现也容易(现在最新版的C、C++、Fortran编译器基本上都内置OpenMP支持)。不过OpenMP最大的缺点是只能在单台主机上工作,不能用于多台主机间的并行计算!如果要多主机联网使用OpenMP(比如在超级计算机上),那必须有额外的工具帮助,比如MPI+OpenMP混合编程。或者是将多主机虚拟成一个共享内存环境(Intel有这样的平台),但这么做效率还不如混合编程,唯一的好处是编程人员可以不必额外学习MPI编程。

在做单片机的程序,由于串口不够,需要用IO口来模拟出一个串口。经过若干曲折并参考了一些现有的资料,基本上完成了。现在将完整的测试程序,以及其中一些需要总结的部分贴出来。

程序硬件平台:110592M晶振,

/

在单片机上模拟了一个串口,使用P21作为发送端

把单片机中存放的数据通过P21作为串口TXD发送出去

/

#include <reg51h>

#include <stdioh>

#include <stringh>

typedef unsigned char uchar;

int i;

uchar code info[] =

{

0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55

};

sbit newTXD = P2^1;//模拟串口的发送端设为P21

void UartInit()

{

SCON = 0x50; // SCON: serail mode 1, 8-bit UART

TMOD |= 0x21; // T0工作在方式1,十六位定时

PCON |= 0x80; // SMOD=1;

TH0 = 0xFE; // 定时器0初始值,延时417us,目的是令模拟串口的波特率为2400bps fosc=110592MHz

TL0 = 0x7F; // 定时器0初始值,延时417us,目的是令模拟串口的波特率为2400bps fosc=110592MHz

// TH0 = 0xFD; // 定时器0初始值,延时417us,目的是令模拟串口的波特率为2400bps fosc=18432MHz

// TL0 = 0x7F; // 定时器0初始值,延时417us,目的是令模拟串口的波特率为2400bps fosc=18432MHz

}

void WaitTF0(void)

{

while(!TF0);

TF0=0;

TH0=0xFE; // 定时器重装初值 fosc=110592MHz

TL0=0x7F; // 定时器重装初值 fosc=110592MHz

// TH0 = 0xFD; // 定时器重装初值 fosc=18432MHz

// TL0 = 0x7F; // 定时器重装初值 fosc=18432MHz

}

void WByte(uchar input)

{

//发送启始位

uchar j=8;

TR0=1;

newTXD=(bit)0;

WaitTF0();

//发送8位数据位

while(j--)

{

newTXD=(bit)(input&0x01); //先传低位

WaitTF0();

input=input>>1;

}

//发送校验位(无)

//发送结束位

newTXD=(bit)1;

WaitTF0();

TR0=0;

}

void Sendata()

{

for(i=0;i<sizeof(info);i++)//外层循环,遍历数组

{

WByte(info[i]);

}

}

void main()

{

UartInit();

while(1)

{

Sendata();

}

}

##############################################################################

/

模拟接收程序,这个程序的作用从模拟串口接收数据,然后将这些数据发送到实际串口

在单片机上模拟了一个串口,使用P32作为发送和接收端

以P32模拟串口接收端,从模拟串口接收数据发至串口

/

#include<reg51h>

#include<stdioh>

#include<stringh>

typedef unsigned char uchar ;

//这里用来切换晶振频率,支持110592MHz和18432MHz

//#define F18_432

#define F11_0592

uchar tmpbuf2[64]={0};

//用来作为模拟串口接收数据的缓存

struct

{

uchar recv :6 ;//tmpbuf2数组下标,用来将模拟串口接收到的数据存放到tmpbuf2中

uchar send :6 ;//tmpbuf2数组下标,用来将tmpbuf2中的数据发送到串口

}tmpbuf2_point={0,0};

sbit newRXD=P3^2 ;//模拟串口的接收端设为P32

void UartInit()

{

SCON=0x50 ;// SCON: serail mode 1, 8-bit UART

TMOD|=0x21 ;// TMOD: timer 1, mode 2, 8-bit reload,自动装载预置数(自动将TH1送到TL1);T0工作在方式1,十六位定时

PCON|=0x80 ;// SMOD=1;

#ifdef F11_0592

TH1=0xE8 ;// Baud:2400 fosc=110592MHz 2400bps为从串口接收数据的速率

TL1=0xE8 ;// 计数器初始值,fosc=110592MHz 因为TH1一直往TL1送,所以这个初值的意义不大

TH0=0xFF ;// 定时器0初始值,延时208us,目的是令模拟串口的波特率为9600bps fosc=110592MHz

TL0=0xA0 ;// 定时器0初始值,延时208us,目的是令模拟串口的波特率为9600bps fosc=110592MHz

#endif

#ifdef F18_432

TH1=0xD8 ; // Baud:2400 fosc=18432MHz 2400bps为从串口接收数据的速率

TL1=0xD8 ; // 计数器初始值,fosc=18432MHz 因为TH1一直往TL1送,所以这个初值的意义不大

TH0=0xFF ;// 定时器0初始值,延时104us,目的是令模拟串口的波特率为9600bps fosc=18432MHz

TL0=0x60 ;// 定时器0初始值,延时104us,目的是令模拟串口的波特率为9600bps fosc=18432MHz

#endif

IE|=0x81 ;// 中断允许总控制位EA=1;使能外部中断0

TF0=0 ;

IT0=1 ;// 设置外部中断0为边沿触发方式

TR1=1 ;// 启动TIMER1,用于产生波特率

}

void WaitTF0(void)

{

while(!TF0);

TF0=0 ;

#ifdef F11_0592

TH0=0xFF ;// 定时器重装初值 模拟串口的波特率为9600bps fosc=110592MHz

TL0=0xA0 ;// 定时器重装初值 模拟串口的波特率为9600bps fosc=110592MHz

#endif

#ifdef F18_432

TH0=0xFF ;

// 定时器重装初值 fosc=18432MHz

TL0=0x60 ;

// 定时器重装初值 fosc=18432MHz

#endif

}

//接收一个字符

uchar RByte()

{

uchar Output=0 ;

uchar i=8 ;

TR0=1 ; //启动Timer0

#ifdef F11_0592

TH0=0xFF ;// 定时器重装初值 模拟串口的波特率为9600bps fosc=110592MHz

TL0=0xA0 ;// 定时器重装初值 模拟串口的波特率为9600bps fosc=110592MHz

#endif

#ifdef F18_432

TH0=0xFF ;// 定时器重装初值 fosc=18432MHz

TL0=0x60 ;// 定时器重装初值 fosc=18432MHz

#endif

TF0=0 ;

WaitTF0();//等过起始位

//接收8位数据位

while(i--)

{

Output>>=1 ;

if(newRXD)Output|=0x80 ;//先收低位

WaitTF0();//位间延时

}

TR0=0 ;//停止Timer0

return Output ;

}

//向COM1发送一个字符

void SendChar(uchar byteToSend)

{

SBUF=byteToSend ;

while(!TI);

TI=0 ;

}

void main()

{

UartInit();

while(1)

{

if(tmpbuf2_pointrecv!=tmpbuf2_pointsend)//差值表示模拟串口接收数据缓存中还有多少个字节的数据未被处理(发送至串口)

{

SendChar(tmpbuf2[tmpbuf2_pointsend++]);

}

}

}

//外部中断0,说明模拟串口的起始位到来了

void Simulated_Serial_Start()interrupt 0

{

EX0=0 ; //屏蔽外部中断0

tmpbuf2[tmpbuf2_pointrecv++]=RByte(); //从模拟串口读取数据,存放到tmpbuf2数组中

IE0=0 ; //防止外部中断响应2次,防止外部中断函数执行2次

EX0=1 ; //打开外部中断0

}

51单片机超声波DIY

以上就是关于C语言中的MPI编程和多线程有什么区别,MPI编程中针对的是一台电脑多核还是多台电脑谢谢!全部的内容,包括:C语言中的MPI编程和多线程有什么区别,MPI编程中针对的是一台电脑多核还是多台电脑谢谢!、AT89S52单片机并行转串行c语言程序、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10134959.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存