2014-12-10 1 views
4

float 유형의 배열을 보내는 C++/mpi (mvapich)의 간단한 프로그램이 있습니다. MPI_Send, MPI_Ssend, MPI_Rsend를 사용할 때 데이터 크기가 열심히 임계 값 (내 프로그램에서 64k) 이상인 경우 MPI_Send 호출 중에 프로그램이 중단됩니다.MVAPICH가 eager threshold보다 큰 메시지에 대해 MPI_Send에서 멈 춥니 다.

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 

및 구성 : 매개 변수가 울부 짖는 소리입니다,

#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; 
} 

내가 내 설정이 잘못된 것 같아요 :

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 
배열이 임계 값보다 작은 경우, 프로그램은 fine.Source 코드가 우는 소리입니다 작동

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

이 프로그램은이 개 프로세스에서 실행

아이디어가 있으십니까?

답변

1

교착 상태없이 781.2 KiB를 사용하여 노트북에서 실행했습니다. 교착 상태없이 781.2 KiB의 Blue Gene/Q를 사용하십시오. 따라서 짧은 테스트 케이스를 이용해 주셔서 감사합니다. 문제를 재현하지 못해 죄송합니다. infiniband에 특정한 것일 수 있습니까?

이 경우 일반적인 해결책은 비 차단 송신 및 수신을 게시하는 것입니다. 코드를 제공 할 수는 있지만 준비가되어 있고 열악한 임계 값에 대해 묻는 중입니다. 따라서 이미 그 사실을 알고 있고 사용하지 않을 충분한 이유가 있어야합니다.

0

방금 ​​실행했습니다. InfiniBand 시스템에서 MVAPICH2-2.0을 사용하여 테스트 케이스를 작성했는데 중단을 재현 할 수 없었습니다. 걸려있는 프로세스의 디버그 추적을 게시 할 수 있습니까?

$ gdb attach <PID> 
gdb> thread apply all bt 
2

MPI Standard

준비 통신 모드를 사용하는 전송이 일치가 이미 게시받을 경우에만 시작 될 수 있음을 지정합니다. 그렇지 않으면 조작이 잘못되어 그 결과가 정의되지 않습니다.

이 프로그램에서 RecvRsend 전에 게시 될 것입니다, 그래서 작업이 실패하거나 중단 될 수 있다는 보장은 없습니다.

+1

이에 대해 자세히 설명하기 위해 코드는 MPI_Recv 이후와 MPI_Rsend 이전에 동기화를 추가해야합니다. MPI_Barrier에 대한 호출은 잔인 함으로 충분하지만 충분합니다. MPI_Ssend를 통한 포인트 - 투 - 포인트 동기화는 아마도 최소한의 필요한 동기화 일 것이지만,이 경우 MPI_Rsend의 목적을 상쇄합니다. – Jeff