Beispiel #1
0
void 
ping_shorthandler(gasnet_token_t token, harg_t idx) 
{
	gasnet_node_t	node;
	gasnet_AMGetMsgSource(token, &node);

	PRINT_AM(("node=%2d> AMShort Request for (%d,%d)", 
			(int)gasnet_mynode(), (int)node, (int)idx));
        assert(idx >= 0 && idx < threads_num);
        assert(node < gasnet_nodes());
	GASNET_Safe(gasnet_AMReplyShort1(token, hidx_pong_shorthandler, idx));
}
void _xmp_gasnet_atomic_define_do(gasnet_token_t token, const char *src_addr, const size_t elmt_size,
				  gasnet_handlerarg_t addr_hi, gasnet_handlerarg_t addr_lo,
				  gasnet_handlerarg_t local_atomic_operations)
{
  int *dst_addr = (int *)UPCRI_MAKEWORD(addr_hi, addr_lo);

  gasnet_hsl_lock(&_hsl);
  memcpy(dst_addr, src_addr, elmt_size);
  gasnet_hsl_unlock(&_hsl);

  gasnet_AMReplyShort1(token, _XMP_GASNET_ATOMIC_DEFINE_REPLY_DO, local_atomic_operations);
}
Beispiel #3
0
void mpi_probehandler(gasnet_token_t token, harg_t tid) {
  gasnet_node_t   node;
  int mpipeer;
  int tag;
  int reply = 0;
  gasnet_AMGetMsgSource(token, &node);
  assert(tt_thread_map[tid] == node);
  mpipeer = gasnetnode_to_mpirank[node];
  tag = tid;

  MPI_LOCK();
    if (mpi_recvhandle[tid] != MPI_REQUEST_NULL) {
      MPI_Status status;
      int flag = 0;
      MPI_SAFE(MPI_Test(&mpi_recvhandle[tid],&flag,&status));
      if (flag) {
        int sz = mpi_bufsz[tid];
        assert(mpi_recvhandle[tid] == MPI_REQUEST_NULL);
        assert(mpi_sendhandle[tid] == MPI_REQUEST_NULL);
        assert(mpi_buf[tid] != NULL && sz >= 0);
        ACTION_PRINTF("node=%2d> sending MPI reply message, %i bytes\n", (int)gasnet_mynode(), sz);
        MPI_SAFE(MPI_Isend(mpi_buf[tid], sz, MPI_BYTE, mpipeer, 10000+tag, MPI_COMM_WORLD, &(mpi_sendhandle[tid])));
        assert(mpi_sendhandle[tid] != MPI_REQUEST_NULL);
      } 
    } else if (mpi_sendhandle[tid] != MPI_REQUEST_NULL) {
      MPI_Status status;
      int flag = 0;
      MPI_SAFE(MPI_Test(&mpi_sendhandle[tid],&flag,&status));
      if (flag) {
        assert(mpi_recvhandle[tid] == MPI_REQUEST_NULL);
        assert(mpi_sendhandle[tid] == MPI_REQUEST_NULL);
        reply = 1;
      }
    } else {
      /* nothing to do */ 
    }
  MPI_UNLOCK();

  if (reply) {
    assert(mpi_buf[tid] != NULL);
    test_free(mpi_buf[tid]);
    mpi_buf[tid] = NULL;
    PRINT_AM(("node=%2d> Sending AMShort MPI Reply for tid=%i\n",
            (int)gasnet_mynode(), (int)tid));
    GASNET_Safe(gasnet_AMReplyShort1(token, hidx_mpi_replyhandler, tid));
  }
}