草庐IT

c++ - MVAPICH 在 MPI_Send 上挂起大于急切阈值的消息

coder 2024-02-22 原文

在c++/mpi(mvapich)中有一个简单的程序,发送一个float类型的数组。当我使用 MPI_Send、MPI_Ssend、MPI_Rsend 时,如果数据的大小超过急切阈值(在我的程序中为 64k),则在调用 MPI_Send 期间我的程序挂起。如果数组小于阈值,程序运行正常。源代码如下:

#include "mpi.h"
#include <unistd.h>
#include <stdio.h>
int main(int argc,char *argv[]) {
    int mype=0,size=1;

    MPI_Init(&argc,&argv);

    MPI_Comm_rank(MPI_COMM_WORLD,&mype);
    MPI_Comm_size(MPI_COMM_WORLD,&size);

    int num = 2048*2048;
    float* h_pos = new float[num];


    MPI_Status stat;
    if(mype == 0)
    {
        MPI_Rsend(h_pos, 20000, MPI_FLOAT, 1, 5, MPI_COMM_WORLD);
    }

    if(mype == 1)
    {
        printf("%fkb\n", 20000.0f*sizeof(float)/1024);
        MPI_Recv(h_pos, 20000, MPI_FLOAT, 0, 5, MPI_COMM_WORLD, &stat);
    }

    MPI_Finalize();

    return 0;
}

我想我的设置可能有误,参数如下:

MVAPICH2 All Parameters
    MV2_COMM_WORLD_LOCAL_RANK           : 0
    PMI_ID                              : 0
    MPIRUN_RSH_LAUNCH                   : 0
    MPISPAWN_GLOBAL_NPROCS              : 2
    MPISPAWN_MPIRUN_HOST                : g718a
    MPISPAWN_MPIRUN_ID                  : 10800
    MPISPAWN_NNODES                     : 1
    MPISPAWN_WORKING_DIR                : /home/g718a/new_workspace/mpi_test
    USE_LINEAR_SSH                      : 1
    PMI_PORT                            : g718a:42714
    MV2_3DTORUS_SUPPORT                 : 0
    MV2_NUM_SA_QUERY_RETRIES            : 20
    MV2_NUM_SLS                         : 8
    MV2_DEFAULT_SERVICE_LEVEL           : 0
    MV2_PATH_SL_QUERY                   : 0
    MV2_USE_QOS                         : 0
    MV2_ALLGATHER_BRUCK_THRESHOLD       : 524288
    MV2_ALLGATHER_RD_THRESHOLD          : 81920
    MV2_ALLGATHER_REVERSE_RANKING       : 1
    MV2_ALLGATHERV_RD_THRESHOLD         : 0
    MV2_ALLREDUCE_2LEVEL_MSG            : 262144
    MV2_ALLREDUCE_SHORT_MSG             : 2048
    MV2_ALLTOALL_MEDIUM_MSG             : 16384
    MV2_ALLTOALL_SMALL_MSG              : 2048
    MV2_ALLTOALL_THROTTLE_FACTOR        : 4
    MV2_BCAST_TWO_LEVEL_SYSTEM_SIZE     : 64
    MV2_GATHER_SWITCH_PT                : 0
    MV2_INTRA_SHMEM_REDUCE_MSG          : 2048
    MV2_KNOMIAL_2LEVEL_BCAST_MESSAGE_SIZE_THRESHOLD : 2048
    MV2_KNOMIAL_2LEVEL_BCAST_SYSTEM_SIZE_THRESHOLD : 64
    MV2_KNOMIAL_INTER_LEADER_THRESHOLD  : 65536
    MV2_KNOMIAL_INTER_NODE_FACTOR       : 4
    MV2_KNOMIAL_INTRA_NODE_FACTOR       : 4
    MV2_KNOMIAL_INTRA_NODE_THRESHOLD    : 131072
    MV2_RED_SCAT_LARGE_MSG              : 524288
    MV2_RED_SCAT_SHORT_MSG              : 64
    MV2_REDUCE_2LEVEL_MSG               : 16384
    MV2_REDUCE_SHORT_MSG                : 8192
    MV2_SCATTER_MEDIUM_MSG              : 0
    MV2_SCATTER_SMALL_MSG               : 0
    MV2_SHMEM_ALLREDUCE_MSG             : 32768
    MV2_SHMEM_COLL_MAX_MSG_SIZE         : 131072
    MV2_SHMEM_COLL_NUM_COMM             : 8
    MV2_SHMEM_COLL_NUM_PROCS            : 2
    MV2_SHMEM_COLL_SPIN_COUNT           : 5
    MV2_SHMEM_REDUCE_MSG                : 4096
    MV2_USE_BCAST_SHORT_MSG             : 16384
    MV2_USE_DIRECT_GATHER               : 1
    MV2_USE_DIRECT_GATHER_SYSTEM_SIZE_MEDIUM : 1024
    MV2_USE_DIRECT_GATHER_SYSTEM_SIZE_SMALL : 384
    MV2_USE_DIRECT_SCATTER              : 1
    MV2_USE_OSU_COLLECTIVES             : 1
    MV2_USE_OSU_NB_COLLECTIVES          : 1
    MV2_USE_KNOMIAL_2LEVEL_BCAST        : 1
    MV2_USE_KNOMIAL_INTER_LEADER_BCAST  : 1
    MV2_USE_SCATTER_RD_INTER_LEADER_BCAST : 1
    MV2_USE_SCATTER_RING_INTER_LEADER_BCAST : 1
    MV2_USE_SHMEM_ALLREDUCE             : 1
    MV2_USE_SHMEM_BARRIER               : 1
    MV2_USE_SHMEM_BCAST                 : 1
    MV2_USE_SHMEM_COLL                  : 1
    MV2_USE_SHMEM_REDUCE                : 1
    MV2_USE_TWO_LEVEL_GATHER            : 1
    MV2_USE_TWO_LEVEL_SCATTER           : 1
    MV2_USE_XOR_ALLTOALL                : 1
    MV2_DEFAULT_SRC_PATH_BITS           : 0
    MV2_DEFAULT_STATIC_RATE             : 0
    MV2_DEFAULT_TIME_OUT                : 67374100
    MV2_DEFAULT_MTU                     : 0
    MV2_DEFAULT_PKEY                    : 0
    MV2_DEFAULT_PORT                    : -1
    MV2_DEFAULT_GID_INDEX               : 0
    MV2_DEFAULT_PSN                     : 0
    MV2_DEFAULT_MAX_RECV_WQE            : 128
    MV2_DEFAULT_MAX_SEND_WQE            : 64
    MV2_DEFAULT_MAX_SG_LIST             : 1
    MV2_DEFAULT_MIN_RNR_TIMER           : 12
    MV2_DEFAULT_QP_OUS_RD_ATOM          : 257
    MV2_DEFAULT_RETRY_COUNT             : 67900423
    MV2_DEFAULT_RNR_RETRY               : 202639111
    MV2_DEFAULT_MAX_CQ_SIZE             : 40000
    MV2_DEFAULT_MAX_RDMA_DST_OPS        : 4
    MV2_INITIAL_PREPOST_DEPTH           : 10
    MV2_IWARP_MULTIPLE_CQ_THRESHOLD     : 32
    MV2_NUM_HCAS                        : 1
    MV2_NUM_NODES_IN_JOB                : 1
    MV2_NUM_PORTS                       : 1
    MV2_NUM_QP_PER_PORT                 : 1
    MV2_MAX_RDMA_CONNECT_ATTEMPTS       : 10
    MV2_ON_DEMAND_UD_INFO_EXCHANGE      : 1
    MV2_PREPOST_DEPTH                   : 64
    MV2_HOMOGENEOUS_CLUSTER             : 0
    MV2_COALESCE_THRESHOLD              : 6
    MV2_DREG_CACHE_LIMIT                : 0
    MV2_IBA_EAGER_THRESHOLD             : 0
    MV2_MAX_INLINE_SIZE                 : 0
    MV2_MAX_R3_PENDING_DATA             : 524288
    MV2_MED_MSG_RAIL_SHARING_POLICY     : 0
    MV2_NDREG_ENTRIES                   : 0
    MV2_NUM_RDMA_BUFFER                 : 0
    MV2_NUM_SPINS_BEFORE_LOCK           : 2000
    MV2_POLLING_LEVEL                   : 1
    MV2_POLLING_SET_LIMIT               : -1
    MV2_POLLING_SET_THRESHOLD           : 256
    MV2_R3_NOCACHE_THRESHOLD            : 32768
    MV2_R3_THRESHOLD                    : 4096
    MV2_RAIL_SHARING_LARGE_MSG_THRESHOLD : 16384
    MV2_RAIL_SHARING_MED_MSG_THRESHOLD  : 2048
    MV2_RAIL_SHARING_POLICY             : 4
    MV2_RDMA_EAGER_LIMIT                : 32
    MV2_RDMA_FAST_PATH_BUF_SIZE         : 4096
    MV2_RDMA_NUM_EXTRA_POLLS            : 1
    MV2_RNDV_EXT_SENDQ_SIZE             : 5
    MV2_RNDV_PROTOCOL                   : 3
    MV2_SMALL_MSG_RAIL_SHARING_POLICY   : 0
    MV2_SPIN_COUNT                      : 5000
    MV2_SRQ_LIMIT                       : 30
    MV2_SRQ_MAX_SIZE                    : 4096
    MV2_SRQ_SIZE                        : 256
    MV2_STRIPING_THRESHOLD              : 8192
    MV2_USE_COALESCE                    : 0
    MV2_USE_XRC                         : 0
    MV2_VBUF_MAX                        : -1
    MV2_VBUF_POOL_SIZE                  : 512
    MV2_VBUF_SECONDARY_POOL_SIZE        : 256
    MV2_VBUF_TOTAL_SIZE                 : 0
    MV2_USE_HWLOC_CPU_BINDING           : 1
    MV2_ENABLE_AFFINITY                 : 1
    MV2_ENABLE_LEASTLOAD                : 0
    MV2_SMP_BATCH_SIZE                  : 8
    MV2_SMP_EAGERSIZE                   : 65537
    MV2_SMPI_LENGTH_QUEUE               : 262144
    MV2_SMP_NUM_SEND_BUFFER             : 256
    MV2_SMP_SEND_BUF_SIZE               : 131072
    MV2_USE_SHARED_MEM                  : 1
    MV2_CUDA_BLOCK_SIZE                 : 0
    MV2_CUDA_NUM_RNDV_BLOCKS            : 8
    MV2_CUDA_VECTOR_OPT                 : 1
    MV2_CUDA_KERNEL_OPT                 : 1
    MV2_EAGER_CUDAHOST_REG              : 0
    MV2_USE_CUDA                        : 1
    MV2_CUDA_NUM_EVENTS                 : 64
    MV2_CUDA_IPC                        : 1
    MV2_CUDA_IPC_THRESHOLD              : 0
    MV2_CUDA_ENABLE_IPC_CACHE           : 0
    MV2_CUDA_IPC_MAX_CACHE_ENTRIES      : 1
    MV2_CUDA_IPC_NUM_STAGE_BUFFERS      : 2
    MV2_CUDA_IPC_STAGE_BUF_SIZE         : 524288
    MV2_CUDA_IPC_BUFFERED               : 1
    MV2_CUDA_IPC_BUFFERED_LIMIT         : 33554432
    MV2_CUDA_IPC_SYNC_LIMIT             : 16384
    MV2_CUDA_USE_NAIVE                  : 1
    MV2_CUDA_REGISTER_NAIVE_BUF         : 524288
    MV2_CUDA_GATHER_NAIVE_LIMIT         : 32768
    MV2_CUDA_SCATTER_NAIVE_LIMIT        : 2048
    MV2_CUDA_ALLGATHER_NAIVE_LIMIT      : 1048576
    MV2_CUDA_ALLGATHERV_NAIVE_LIMIT     : 524288
    MV2_CUDA_ALLTOALL_NAIVE_LIMIT       : 262144
    MV2_CUDA_ALLTOALLV_NAIVE_LIMIT      : 262144
    MV2_CUDA_BCAST_NAIVE_LIMIT          : 2097152
    MV2_CUDA_GATHERV_NAIVE_LIMIT        : 0
    MV2_CUDA_SCATTERV_NAIVE_LIMIT       : 16384
    MV2_CUDA_ALLTOALL_DYNAMIC           : 1
    MV2_CUDA_ALLGATHER_RD_LIMIT         : 1024
    MV2_CUDA_ALLGATHER_FGP              : 1
    MV2_SMP_CUDA_PIPELINE               : 1
    MV2_CUDA_INIT_CONTEXT               : 1
    MV2_SHOW_ENV_INFO                   : 2
    MV2_DEFAULT_PUT_GET_LIST_SIZE       : 200
    MV2_EAGERSIZE_1SC                   : 0
    MV2_GET_FALLBACK_THRESHOLD          : 0
    MV2_PIN_POOL_SIZE                   : 2097152
    MV2_PUT_FALLBACK_THRESHOLD          : 0
    MV2_ASYNC_THREAD_STACK_SIZE         : 1048576
    MV2_THREAD_YIELD_SPIN_THRESHOLD     : 5
    MV2_USE_HUGEPAGES                   : 1

和配置:

 mpiname -a

MVAPICH2 2.0 Fri Jun 20 20:00:00 EDT 2014 ch3:mrail

Compilation
CC: gcc    -DNDEBUG -DNVALGRIND -O2
CXX: g++   -DNDEBUG -DNVALGRIND
F77: no -L/lib -L/lib  
FC: no  

Configuration
-with-device=ch3:mrail --with-rdma=gen2 --enable-cuda --disable-f77 --disable-fc --disable-mcast

程序运行在 2 个进程上:

mpirun_rsh -hostfile hosts -n 2 MV2_USE_CUDA=1 MV2_SHOW_ENV_INFO=2 ./myTest

有什么想法吗?

最佳答案

MPI Standard指定

A send that uses the ready communication mode may be started only if the matching receive is already posted. Otherwise, the operation is erroneous and its outcome is undefined.

在这个程序中,不保证 Recv 会在 Rsend 之前发送,因此操作可能会失败或挂起。

关于c++ - MVAPICH 在 MPI_Send 上挂起大于急切阈值的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27405813/

有关c++ - MVAPICH 在 MPI_Send 上挂起大于急切阈值的消息的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  4. ruby - 为什么人们使用 `Module.send(:prepend, …)` ? - 2

    我正在学习如何在我的Ruby代码中使用Module.prepend而不是alias_method_chain,我注意到有些人使用send调用它(example):ActionView::TemplateRenderer.send(:prepend,ActionViewTemplateRendererWithCurrentTemplate)而其他人直接调用它(example):ActionView::TemplateRenderer.prepend(ActionViewTemplateRendererWithCurrentTemplate)而且,虽然我还没有看到任何人使用这种风格,但我从

  5. ruby - 使用 Ruby 通过 Outlook 发送消息的最简单方法是什么? - 2

    我的工作要求我为某些测试自动生成电子邮件。我一直在四处寻找,但未能找到可以快速实现的合理解决方案。它需要在outlook而不是其他邮件服务器中,因为我们有一些奇怪的身份验证规则,我们需要保存草稿而不是仅仅发送邮件的选项。显然win32ole可以做到这一点,但我找不到任何相当简单的例子。 最佳答案 假设存储了Outlook凭据并且您设置为自动登录到Outlook,WIN32OLE可以很好地完成此操作:require'win32ole'outlook=WIN32OLE.new('Outlook.Application')message=

  6. Ruby - 如何将消息长度表示为 2 个二进制字节 - 2

    我正在使用Ruby,我正在与一个网络端点通信,该端点在发送消息本身之前需要格式化“header”。header中的第一个字段必须是消息长度,它被定义为网络字节顺序中的2二进制字节消息长度。比如我的消息长度是1024。如何将1024表示为二进制双字节? 最佳答案 Ruby(以及Perl和Python等)中字节整理的标准工具是pack和unpack。ruby的packisinArray.您的长度应该是两个字节长,并且按网络字节顺序排列,这听起来像是n格式说明符的工作:n|Integer|16-bitunsigned,network(bi

  7. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  8. ruby-on-rails - 在 Flash 警报 Rails 3 中显示错误消息 - 2

    如果我在模型中设置验证消息validates:name,:presence=>{:message=>'Thenamecantbeblank.'}我如何让该消息显示在闪光警报中,这是我迄今为止尝试过的方法defcreate@message=Message.new(params[:message])if@message.valid?ContactMailer.send_mail(@message).deliverredirect_to(root_path,:notice=>"Thanksforyourmessage,Iwillbeintouchsoon")elseflash[:error]

  9. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  10. ruby-on-rails - 在 RSpec 中,如何以任意顺序期望具有不同参数的多条消息? - 2

    RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)

随机推荐