MVAPICH2支持多线程和设备间通信问题

MVAPICH2多线程支持问题

MVAPICH2为了优化性能,默认的情况是将进程绑定到处理器的。因此默认是只支持单线程的,如果要运行MPI多线程程序,可以通过以下方式运行多线程:

$ mpirun  -np 2 –env MV2_ENABLE_AFFINITY  0  ./mpi
app

(或者:$ mpirun_rsh  -np 2
MV2_ENABLE_AFFINITY =0  ./mpi app)

当然在程序mpiapp的代码中MPI初始化函数MPI_Init(),要用函数MPI_Init_thread()代替,例如:

int provided;

MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE,
&provided);

if(provided != MPI_THREAD_MULTIPLE)

{

printf("MPI do not Support Multiple
thread\n");

MPI_Abort(MPI_COMM_WORLD,-1);

}

环境配置文件:将配置文件中MV2_ENABLE_AFFINITY0

系统的配置文件在:/etc/mvapich2.conf;

用户的配置文件在:~/.mvapich2.conf;

GPU内存间的MPI通信

一般在没有CUDA的支持下,设备内存间的MPI通信如下:

cudaMemcpy(host buf, device buf, size,
cudaMemcpyDeviceToDevice);

MPI_Send(host buf, size, MPI CHAR, 1, 100, MPI COMM WORLD, req);

若要从设备到设备内存,设备内存到主机内存,主机内存到设备内存的MPI通信,

则设置环境变量 MV2 USE CUDA 为1 (系统默认是0,即不支持设备间内存通信),设备间可以直接通信,如下:

MPI_Send(device buf, size, MPI CHAR, 1, 100, MPI COMM WORLD,
req);

$ mpirun  -np 2 –env MV2_USE_CUDA  1  ./mpi
app

(或者$ mpirun_rsh  -np 2
MV2_USE_CUDA =1  ./mpi app)

 

 

环境配置文件:将配置文件中MV2_USE_CUDA1

系统的配置文件在:/etc/mvapich2.conf;

用户的配置文件在:~/.mvapich2.conf;

时间: 2024-10-31 16:08:45

MVAPICH2支持多线程和设备间通信问题的相关文章

看到有网友说Node.js是支持多线程的,我在这里解释一下

Node.js确实有一个扩展,叫tagg,可以实现多线程.但实际上是这样的,它的这个多线程只是一个线程池,去执行一部分计算的任务. EventLoop和IO的处理部分始终是单线程的,在任务线程中不能调用异步接口,只能计算或者执行阻塞IO. 除了tagg之外,Node.js还有child_process,cluster等扩展可以实现多进程.但这里的多进程也不知真正意义上的子进程.而是node的另外一个实例.它无法继承使用父进程的任何资源. 注:有好多同学说,单线程EventLoop足够用了.各位可

php不支持多线程怎么办

PHP 默认并不支持多线程,要使用多线程需要安装 pthread 扩展,而要安装 pthread 扩展,必须使用 --enable-maintainer-zts 参数重新编译 PHP,这个参数是指定编译 PHP 时使用线程安全方式. 线程安全 多线程是让程序变得不安分的一个因素,在使用多线程之前,首先要考虑线程安全问题: 线程安全:线程安全是编程中的术语,指某个函数.函数库在多线程环境中被调用时,能够正确地处理多个线程之间的共享变量,使程序功能正确完成. 在传统多线程中,由于多个线程共享变量,所

多线程之间的通信实例讲解

                 多线程之间的通信实例讲解对于线程来说,说白了,就是一个函数,如果大家对于这章函数都有理解,那我对于操作系统,线程和进程间的通信会有一个新的认识!接下来我会对每一行代码进行注释,在此过程中,大家也可以对c语言有一个崭新的认识. 第一个函数,创建两个线程. #include <stdio.h>#include <pthread.h>    这个头函数要包含,因为我们后续用的函数都是系统调用,因此需要申请头函数   这样在编译的时候,就可以找到此函数的源

多线程之间的通信(等待唤醒机制、Lock 及其它线程的方法)

一.多线程之间的通信. 就是多个线程在操作同一份数据, 但是操作的方法不同. 如: 对于同一个存储块,其中有两个存储位:name   sex, 现有两个线程,一个向其中存放数据,一个打印其中的数据. 为了解决上述问题中的安全问题(在存放线程进行存放操作的时候, 打印线程不能对共有数据进行操作),所以应当对两个线程       操作共有数据的代码部分进行同步(使用synchronized(),来进行同步, 注意 :使用同一个对象作为同步锁. 二.等待唤醒机制. 在上述案例实现过后运行,会发现:打印

监控之cacti的安装部署(监控本机及其他主机+支持多线程+命令行监控)

主机环境   redhat6.5 64位 实验环境   服务端1 ip 172.25.25.1            服务端2 ip 172.25.25.2 安装包     cacti-0.8.8h.tar.gz      php-snmp-5.3.3-26.el6.x86_64.rpm cacti-spine-0.8.8g.tar.gz 防火墙状态:关闭 Selinux状态:Disabled 1.配置安装cacti及测试 A)配置安装cacti [[email protected] Asia]

多线程-线程间通信

1.多线程-线程间通信-问题演示 多线程间通信:多个线程处理同一资源,但是处理动作却不同. //创建一个资源描述.资源中有name sex.用于存储数据. class Resource{     String name;     String sex; } //需要定义一个输入任务描述.既然是线程任务,必须实现Runnable接口.  class Input implements Runnable{     private Resource r;     Input(Resource r){  

ThreadSafeClientConnManager用来支持多线程的使用http client

ThreadSafeClientConnManager用来支持多线程的使用http client import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.Defau

多线程-线程间通信-多生产者多消费者示例

1.多线程-线程间通信-多生产者多消费者问题 多生产者和多消费者.等待唤醒机制. 产生了两个问题: 1.出现了多次连续生产,未消费,或者一个商品被消费多次. 解决:必须要--------每一个被唤醒的线程判断一次标记,所以将if判断改为while判断. 2.出现了死锁. 本方唤醒了本方,导致了所有的线程都等待了. 解决方式就是:唤醒所有等待的线程.这样既唤醒了本方也唤醒对方. 虽然解决了多生产消费的问题,但是有些低效. 解决方法一: 唤醒所有等待的线程 class Resource{     p

linux之多线程fork:进程通信

++++++++++++++++++信号机制+++++++++++++++++++ 接收信号 int signal(int sig,__sighandler_t handler); int func(int sig); sig 指明了所要处理的信号类型,handler是SIG_IGN,SIG_DFL或者返回值为整数的函数地址. 当执行了signal函数后,进程只要接收到类型为sig 的信号,就立即执行 func()函数,不管其正在执行程序的哪一部分.当func()函数执行结束后,程序返回到进程被