⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mx_module_send.c

📁 fortran并行计算包
💻 C
字号:
/* -*- Mode: C; c-basic-offset:4 ; -*- *//* *  (C) 2006 by Argonne National Laboratory. *      See COPYRIGHT in top-level directory. */#include "mx_module_impl.h"#include "myriexpress.h"#include "mx_module.h"#include "my_papi_defs.h"#undef FUNCNAME#define FUNCNAME MPID_nem_mx_module_send#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)int MPID_nem_mx_module_send (MPIDI_VC_t *vc, MPID_nem_cell_ptr_t cell, int datalen){   MPID_nem_mx_cell_ptr_t cell_req;   mx_request_t          *request;      mx_segment_t           seg;      mx_return_t            ret;	      mx_status_t            status;   uint32_t               result;   int                    data_size;   int                    dest = vc->lpid;   int                    mpi_errno = MPI_SUCCESS;      MPIU_Assert (datalen <= MPID_NEM_MPICH2_DATA_LEN);      if ( MPID_nem_mx_req_queue_empty(MPID_nem_module_mx_send_free_req_queue))     {	MPID_nem_mx_cell_ptr_t curr_cell = MPID_nem_module_mx_send_pending_req_queue->head;	ret = mx_wait(MPID_nem_module_mx_local_endpoint,		      MPID_NEM_MX_CELL_TO_REQUEST(curr_cell),		      MX_INFINITE,		      &status,		      &result);	MPIU_ERR_CHKANDJUMP1 (ret != MX_SUCCESS, mpi_errno, MPI_ERR_OTHER, "**mx_wait", "**mx_wait %s", mx_strerror (ret));	if((result != 0) && (status.code == MX_STATUS_SUCCESS))	  {		     MPID_nem_queue_enqueue (MPID_nem_process_free_queue, (MPID_nem_cell_ptr_t)status.context); 	     MPID_nem_mx_req_queue_dequeue(MPID_nem_module_mx_send_pending_req_queue,&cell_req);	     	   	     MPID_nem_module_mx_pendings_sends--;	     goto regular_step;	  }     }   else          {	MPID_nem_mx_req_queue_dequeue(MPID_nem_module_mx_send_free_req_queue,&cell_req);	     	regular_step:		  {	     	     request   = MPID_NEM_MX_CELL_TO_REQUEST(cell_req);	     data_size = datalen + MPID_NEM_MPICH2_HEAD_LEN;	     	     seg.segment_ptr    = (void *)(MPID_NEM_CELL_TO_PACKET (cell));	       		     seg.segment_length = data_size ;  	     	     ret = mx_isend(MPID_nem_module_mx_local_endpoint,			    &seg,1,			    MPID_nem_module_mx_endpoints_addr[dest],			    MPID_NEM_MX_MATCH,			    (void *)cell,			    request);		     MPIU_ERR_CHKANDJUMP1 (ret != MX_SUCCESS, mpi_errno, MPI_ERR_OTHER, "**mx_isend", "**mx_isend %s", mx_strerror (ret));	     	     	     if(MPID_nem_module_mx_pendings_sends == 0)	       {			  ret = mx_test(MPID_nem_module_mx_local_endpoint,				request,				&status,				&result);		  MPIU_ERR_CHKANDJUMP1 (ret != MX_SUCCESS, mpi_errno, MPI_ERR_OTHER, "**mx_test", "**mx_test %s", mx_strerror (ret));		  				  		  if((result != 0) && (status.code == MX_STATUS_SUCCESS))		    		    {			       MPID_nem_queue_enqueue (MPID_nem_process_free_queue, (MPID_nem_cell_ptr_t)status.context);		       MPID_nem_mx_req_queue_enqueue(MPID_nem_module_mx_send_free_req_queue,cell_req);		    }  		  else		    {		       MPID_nem_mx_req_queue_enqueue(MPID_nem_module_mx_send_pending_req_queue,cell_req);		       MPID_nem_module_mx_pendings_sends++;		    }  	       }		     else	       {		  MPID_nem_mx_req_queue_enqueue(MPID_nem_module_mx_send_pending_req_queue,cell_req);		  MPID_nem_module_mx_pendings_sends++;	       }		  }	     }      fn_exit:      return mpi_errno;   fn_fail:      goto fn_exit;   }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -