我使用MVAPICH2启动了MPI程序,并收到此错误:
Fatal error in PMPI_Gather:
Invalid buffer pointer, error stack:
PMPI_Gather(923): MPI_Gather() failed
PMPI_Gather(857): Buffers must not be aliased
Run Code Online (Sandbox Code Playgroud)
我认为有两种方法可以解决此问题:
有人知道我该如何使用MVAPICH2吗?一些编译器选项,参数,环境变量等?
像MV2_NO_BUFFER_ALIAS_CHECK之类的东西,但是它不起作用。
是否可以在一方不知道另一方的等级的情况下进行 MPI_Sendrecv 交换?如果不是,那么最好的方法是什么(我的下一个猜测就是一对发送和接收)?
例如,在 C 中,如果我想在等级 0 和其他等级之间交换整数,这种类型的事情是否可行?:
MPI_Status stat;
if(rank){
int someval = 0;
MPI_Sendrecv(&someval, 1, MPI_INT, 0, 1, &recvbuf, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &stat);
}else{
int someotherval = 1;
MPI_Sendrecv(&someotherval, 1, MPI_INT, MPI_ANY_SOURCE, someotherval, &recvbuf, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &stat);
}
Run Code Online (Sandbox Code Playgroud)
编辑:看起来这是不可能的。我将以下内容作为一种包装来添加我需要的功能。
void slave_sendrecv(const void *sendbuf, int sendcount, MPI_Datatype sendtype,
int dest, int sendtag, void *recvbuf, int recvcount,
MPI_Datatype recvtype, int source, int recvtag, MPI_Status *status){
MPI_Send(sendbuf, sendcount, sendtype, dest, sendtag, MPI_COMM_WORLD);
MPI_Recv(recvbuf, recvcount, recvtype, source, …Run Code Online (Sandbox Code Playgroud) 我使用 MPI2.2 标准用 C 编写并行程序。我有 64 位机器。
/* MPI offset is long long*/
MPI_Offset my_offset; printf ("%3d: my offset = %lld\n", my_rank, my_offset);
int count;
MPI_Get_count(&status, MPI_BYTE, &count);
printf ("%3d: read =%d\n", my_rank, count);
Run Code Online (Sandbox Code Playgroud)
我正在逐字节读取一个非常大的文件。为了并行读取文件,我正在使用偏移变量为每个进程设置偏移量。我对 MPI_offset 类型的数据类型感到困惑,那么"whither it is signed or unsigned"长?
我的第二个问题是关于 MPI_Get_count() 函数中使用的“计数变量范围”的限制。因为这里使用这个函数从每个进程的缓冲区中读取所有元素so i think it should also be of the long long type to read such a very large file.
正如我所学的,各种并行范例标准的基础知识,例如OpenMP,MPI,OpenCL,可以编写并行程序。但是我对Map-Reduce编程模型不了解很多。
众所周知,各种流行的公司都在遵循Map-Reduce编程模型来解决其庞大的数据密集型任务。MPI和MPI都是为大型并行计算机和工作站群集上的高性能计算而设计的。
所以我的第一个困惑是..我可以使用Map-Reduce模型代替MPI标准吗?反之亦然?还是取决于应用!
它们之间的确切区别是什么?
Which one is better and when?
Run Code Online (Sandbox Code Playgroud) 我有以下代码
int main(int argc, char* argv[])
{
int rank, size;
MPI_Init (&argc, &argv);
MPI_Comm_rank (MPI_COMM_WORLD, &rank);
MPI_Comm_size (MPI_COMM_WORLD, &size);
MPI_Request mpiRequest;
MPI_Status myStatus;
int tag = 11;
int testData = 12;
MPI_Isend(&testData,1,MPI_INT,(rank+1)%size,tag,MPI_COMM_WORLD,&mpiRequest);
MPI_Wait (&mpiRequest,&myStatus);
int source = (rank+size-1)%size;
int sizeProb = MPI_Probe(source,tag,MPI_COMM_WORLD,&myStatus);
int * recvTransferArray = new int [sizeProb];
MPI_Recv(recvTransferArray,sizeProb,MPI_INT,source,tag,MPI_COMM_WORLD,&myStatus);
MPI_Finalize();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题是在sizeProb中我得到0,我应该得到1.
我可以使用MPI_ISend发送数据并使用MPI_Probe/MPI_Recv组合接收数据吗?
我们正在寻求一些有关 slurm salloc GPU 分配的建议。目前,给出:
% salloc -n 4 -c 2 -gres=gpu:1
% srun env | grep CUDA
CUDA_VISIBLE_DEVICES=0
CUDA_VISIBLE_DEVICES=0
CUDA_VISIBLE_DEVICES=0
CUDA_VISIBLE_DEVICES=0
Run Code Online (Sandbox Code Playgroud)
然而,我们希望使用的不仅仅是设备 0。
有没有办法用 srun/mpirun 指定 salloc 以获得以下内容?
CUDA_VISIBLE_DEVICES=0
CUDA_VISIBLE_DEVICES=1
CUDA_VISIBLE_DEVICES=2
CUDA_VISIBLE_DEVICES=3
Run Code Online (Sandbox Code Playgroud)
这是期望的,以便每个任务获得 1 个 GPU,但总体 GPU 使用量分布在 4 个可用设备中(请参阅下面的 gres.conf)。不是所有任务都获得 device=0 的地方。
这样,每个任务就不会像当前的情况一样等待设备 0 释放其他任务。
或者即使我们有超过 1 个可用/空闲的 GPU(总共 4 个)用于 4 个任务,这是否是预期的行为?我们遗漏或误解了什么?
总结我们希望能够使用 slurm 和 mpi,以便每个等级/任务使用 1 个 GPU,但作业可以在 4 个 GPU 之间分散任务/等级。目前看来我们仅限于设备 0。我们还希望避免由于 mpi 使用而在 salloc/sbatch 中多次提交 srun。
操作系统:CentOS …
我的问题对那些长期在场的人来说似乎很愚蠢,但我很感激你耐心为我详细阐述.
当他们说MPICH是MPI的"实现"时,它意味着什么?
以下类比是真的(?):如果我们将MPI视为FORTRAN编译器的一组标准,那么MPICH和OPENMPI是FORTRAN编译器的不同版本,如Intel.Fortran,Compaq.Fortran,GNU.Fortran和等等.
我正在阅读有关并行处理的OpenMP和其他主题,并发现其中大量声称CUDA或OpenCL将成为此类系统的未来.但是,我认为OpenMP的某些修改版本将是最佳解决方案,并且没有看到GPU不应该运行线程的原因.
所以我的问题是,GPU可以像CPU一样运行线程吗?可以扩展OpenMP以支持GPU吗?这有什么理论问题吗?
我读到最新的OpenMP标准支持GPU,但是没有一个实现.如果有实现,那么它比OpenCL使用的'内核'模型更好还是更差?
我正在将一个bash脚本从一个Linux盒子复制到我的Mac笔记本电脑上,在这个过程中,脚本开始抱怨使用它;&.
有错误:
./build.sh:line 122:意外标记附近的语法错误`;'
./build.sh:line 122:`;&'
脚本中有一些用法,但简短的用法是:
case ${OPTION} in
xxx)
export DEVICES=xxx
;;
yyy)
export DEVICES=yyy
;;
*)
echo "${OPTION}: Unknown device type: use xxx|yyy"
exit 1
;&
esac
;;
Run Code Online (Sandbox Code Playgroud)
我已经更换了所有的用法;&与;;我想这一切都很好,但我仍然好奇,我做了什么.案例陈述中分号符号和双分号之间的区别是什么?
在过去的几天里,我一直在尝试使用 MPI 用 C 语言编写容错应用程序。我正在尝试学习如何将错误处理程序附加到 MPI_COMM_WORLD 通信器,以便在节点出现故障(可能是由于崩溃)的情况下并退出而不调用 MPI_Finalize() 程序仍然可以从这种情况中恢复并继续计算。
到目前为止,我遇到的问题是,在我将错误处理程序函数附加到通信并导致节点崩溃后,MPI 不会调用错误处理程序,而是强制所有线程退出。
我认为这可能是我的应用程序的问题,所以我在线查找示例代码并尝试运行它,但情况是相同的...我当前尝试运行的示例代码如下。(我从这里得到https://www.google.co.uk/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CC4QFjAA&url=http%3A%2F%2Fwww.shodor.org% 2Fmedia%2Fcontent%2F%2Fpetascale%2Fmaterials%2FdistributedMemory%2Fpresentations%2FMPI_Error_Example.pdf&ei=jq6KUv-BBcO30QW1oYGABg&usg=AFQjCNFa5L_Q6Irg3VrJ3fsQBIyqjBlSgA&sig2=8An4SqBvhCACx5YLwB mROA对 PDF 格式表示歉意,但它不是我写的,所以我现在粘贴下面相同的代码):
/* Template for creating a custom error handler for MPI and a simple program
to demonstrate its' use. How much additional information you can obtain
is determined by the MPI binding in use at build/run time.
To illustrate that the program works correctly use -np 2 through -np 4.
To illustrate an MPI error set victim_mpi = 5 and use -np 6. …Run Code Online (Sandbox Code Playgroud)