static na_return_t msg_unexpected_send_cb(const struct na_cb_info *callback_info) { struct na_test_params *params = (struct na_test_params *) callback_info->arg; na_return_t ret = NA_SUCCESS; if (callback_info->ret == NA_CANCELED) { /* Try again */ printf("NA_Msg_send_unexpected() was successfully canceled\n"); sprintf(params->send_buf, "Hello again Server!"); ret = NA_Msg_send_unexpected(params->na_class, params->context, NULL, NULL, params->send_buf, params->send_buf_len, params->server_addr, NA_TEST_SEND_TAG, NA_OP_ID_IGNORE); if (ret != NA_SUCCESS) { fprintf(stderr, "Could not start send of unexpected message\n"); } return ret; } else { printf("NA_Msg_send_unexpected() was not canceled\n"); } if (callback_info->ret != NA_SUCCESS) { return ret; } return ret; }
/* NA test routines */ static int test_send(struct na_test_params *params, na_tag_t send_tag) { na_return_t na_ret; /* Send a message to addr */ sprintf(params->send_buf, "Hello Server!"); /* Preposting response */ na_ret = NA_Msg_recv_expected(params->network_class, params->context, &msg_expected_recv_cb, params, params->recv_buf, params->recv_buf_len, params->server_addr, send_tag + 1, NA_OP_ID_IGNORE); if (na_ret != NA_SUCCESS) { fprintf(stderr, "Could not prepost recv of expected message\n"); return EXIT_FAILURE; } na_ret = NA_Msg_send_unexpected(params->network_class, params->context, NULL, NULL, params->send_buf, params->send_buf_len, params->server_addr, send_tag, NA_OP_ID_IGNORE); if (na_ret != NA_SUCCESS) { fprintf(stderr, "Could not start send of unexpected message\n"); return EXIT_FAILURE; } return EXIT_SUCCESS; }
/* NA test routines */ static int test_send(struct na_test_params *params) { na_tag_t send_tag = NA_TEST_SEND_TAG; na_op_id_t op_id = NA_OP_ID_NULL; na_return_t na_ret; /* Send a message to addr */ sprintf(params->send_buf, "Hello Server!"); /* Preposting response */ na_ret = NA_Msg_recv_expected(params->na_class, params->context, msg_expected_recv_cb, params, params->recv_buf, params->recv_buf_len, params->recv_buf_plugin_data, params->server_addr, 0, send_tag + 1, &op_id); if (na_ret != NA_SUCCESS) { fprintf(stderr, "Could not prepost recv of expected message\n"); return EXIT_FAILURE; } /* Cancel and repost message */ na_ret = NA_Cancel(params->na_class, params->context, op_id); if (na_ret != NA_SUCCESS) { fprintf(stderr, "Could not cancel recv of expected message\n"); return EXIT_FAILURE; } na_ret = NA_Msg_recv_expected(params->na_class, params->context, msg_expected_recv_cb, params, params->recv_buf, params->recv_buf_len, params->recv_buf_plugin_data, params->server_addr, 0, send_tag + 1, NA_OP_ID_IGNORE); if (na_ret != NA_SUCCESS) { fprintf(stderr, "Could not prepost recv of expected message\n"); return EXIT_FAILURE; } /* Try to cancel unexpected send */ op_id = NA_OP_ID_NULL; na_ret = NA_Msg_send_unexpected(params->na_class, params->context, msg_unexpected_send_cb, params, params->send_buf, params->send_buf_len, params->send_buf_plugin_data, params->server_addr, 0, send_tag, &op_id); if (na_ret != NA_SUCCESS) { fprintf(stderr, "Could not start send of unexpected message\n"); return EXIT_FAILURE; } na_ret = NA_Cancel(params->na_class, params->context, op_id); if (na_ret != NA_SUCCESS) { fprintf(stderr, "Could not cancel send of unexpected message\n"); return EXIT_FAILURE; } return EXIT_SUCCESS; }
/*---------------------------------------------------------------------------*/ static na_return_t na_test_send_finalize(struct na_test_lat_info *na_test_lat_info) { char *send_buf = NULL, *recv_buf = NULL; void *send_buf_data, *recv_buf_data; hg_request_t *recv_request = NULL; na_size_t unexpected_header_size = NA_Msg_get_unexpected_header_size(na_test_lat_info->na_class); na_size_t buf_size = (unexpected_header_size) ? unexpected_header_size + 1 : 1; na_return_t ret = NA_SUCCESS; /* Prepare send_buf */ send_buf = NA_Msg_buf_alloc(na_test_lat_info->na_class, buf_size, &send_buf_data); NA_Msg_init_unexpected(na_test_lat_info->na_class, send_buf, buf_size); /* Prepare recv buf */ recv_buf = NA_Msg_buf_alloc(na_test_lat_info->na_class, buf_size, &recv_buf_data); memset(recv_buf, 0, buf_size); recv_request = hg_request_create(na_test_lat_info->request_class); /* Post recv */ ret = NA_Msg_recv_expected(na_test_lat_info->na_class, na_test_lat_info->context, na_test_recv_expected_cb, recv_request, recv_buf, buf_size, recv_buf_data, na_test_lat_info->target_addr, 0, NA_TEST_TAG_DONE, NA_OP_ID_IGNORE); if (ret != NA_SUCCESS) { NA_LOG_ERROR("NA_Msg_recv_expected() failed"); goto done; } /* Post send */ ret = NA_Msg_send_unexpected(na_test_lat_info->na_class, na_test_lat_info->context, NULL, NULL, send_buf, buf_size, send_buf_data, na_test_lat_info->target_addr, 0, NA_TEST_TAG_DONE, NA_OP_ID_IGNORE); if (ret != NA_SUCCESS) { NA_LOG_ERROR("NA_Msg_send_unexpected() failed"); goto done; } hg_request_wait(recv_request, NA_MAX_IDLE_TIME, NULL); done: /* Clean up resources */ hg_request_destroy(recv_request); NA_Msg_buf_free(na_test_lat_info->na_class, send_buf, send_buf_data); NA_Msg_buf_free(na_test_lat_info->na_class, recv_buf, recv_buf_data); return ret; }
/* NA test routines */ static int test_msg_forward(struct na_test_params *params) { na_return_t na_ret; int ret = EXIT_SUCCESS; /* Send a message to addr */ NA_Msg_init_unexpected(params->na_class, params->send_buf, params->send_buf_len); sprintf(params->send_buf + NA_Msg_get_unexpected_header_size(params->na_class), "Hello Server!"); /* Preposting response */ na_ret = NA_Msg_recv_expected(params->na_class, params->context, msg_expected_recv_cb, params, params->recv_buf, params->recv_buf_len, params->recv_buf_plugin_data, params->server_addr, 0, NA_TEST_SEND_TAG + 1, NA_OP_ID_IGNORE); if (na_ret != NA_SUCCESS) { NA_LOG_ERROR("Could not prepost recv of expected message"); ret = EXIT_FAILURE; goto done; } na_ret = NA_Msg_send_unexpected(params->na_class, params->context, msg_unexpected_send_cb, params, params->send_buf, params->send_buf_len, params->send_buf_plugin_data, params->server_addr, 0, NA_TEST_SEND_TAG, NA_OP_ID_IGNORE); if (na_ret != NA_SUCCESS) { NA_LOG_ERROR("Could not start send of unexpected message"); ret = EXIT_FAILURE; goto done; } done: return ret; }
/*---------------------------------------------------------------------------*/ static na_return_t na_test_measure_latency(struct na_test_lat_info *na_test_lat_info, na_size_t size) { char *send_buf = NULL, *recv_buf = NULL; void *send_buf_data, *recv_buf_data; size_t loop = (size_t) na_test_lat_info->na_test_info.loop * 100; size_t skip = SMALL_SKIP; na_op_id_t send_op_id; na_op_id_t recv_op_id; hg_request_t *recv_request = NULL; na_size_t unexpected_header_size = NA_Msg_get_unexpected_header_size(na_test_lat_info->na_class); na_size_t buf_size = size < unexpected_header_size ? unexpected_header_size : size; size_t avg_iter; double time_read = 0, read_lat; na_return_t ret = NA_SUCCESS; size_t i; /* Prepare send_buf */ if (buf_size == unexpected_header_size) buf_size++; send_buf = NA_Msg_buf_alloc(na_test_lat_info->na_class, buf_size, &send_buf_data); NA_Msg_init_unexpected(na_test_lat_info->na_class, send_buf, buf_size); for (i = unexpected_header_size; i < buf_size; i++) send_buf[i] = (char) i; /* Prepare recv buf */ recv_buf = NA_Msg_buf_alloc(na_test_lat_info->na_class, buf_size, &recv_buf_data); memset(recv_buf, 0, buf_size); /* Create operation IDs */ send_op_id = NA_Op_create(na_test_lat_info->na_class); recv_op_id = NA_Op_create(na_test_lat_info->na_class); recv_request = hg_request_create(na_test_lat_info->request_class); /* Warm up */ for (i = 0; i < skip; i++) { /* Post recv */ ret = NA_Msg_recv_expected(na_test_lat_info->na_class, na_test_lat_info->context, na_test_recv_expected_cb, recv_request, recv_buf, buf_size, recv_buf_data, na_test_lat_info->target_addr, 0, 0, &recv_op_id); if (ret != NA_SUCCESS) { NA_LOG_ERROR("NA_Msg_recv_expected() failed"); goto done; } /* Post send */ ret = NA_Msg_send_unexpected(na_test_lat_info->na_class, na_test_lat_info->context, NULL, NULL, send_buf, buf_size, send_buf_data, na_test_lat_info->target_addr, 0, 0, &send_op_id); if (ret != NA_SUCCESS) { NA_LOG_ERROR("NA_Msg_send_unexpected() failed"); goto done; } hg_request_wait(recv_request, NA_MAX_IDLE_TIME, NULL); hg_request_reset(recv_request); } NA_Test_barrier(&na_test_lat_info->na_test_info); /* Actual benchmark */ for (avg_iter = 0; avg_iter < loop; avg_iter++) { hg_time_t t1, t2; hg_time_get_current(&t1); /* Post recv */ ret = NA_Msg_recv_expected(na_test_lat_info->na_class, na_test_lat_info->context, na_test_recv_expected_cb, recv_request, recv_buf, buf_size, recv_buf_data, na_test_lat_info->target_addr, 0, 1, &recv_op_id); if (ret != NA_SUCCESS) { NA_LOG_ERROR("NA_Msg_recv_expected() failed"); goto done; } /* Post send */ ret = NA_Msg_send_unexpected(na_test_lat_info->na_class, na_test_lat_info->context, NULL, NULL, send_buf, buf_size, send_buf_data, na_test_lat_info->target_addr, 0, 1, &send_op_id); if (ret != NA_SUCCESS) { NA_LOG_ERROR("NA_Msg_send_unexpected() failed"); goto done; } hg_request_wait(recv_request, NA_MAX_IDLE_TIME, NULL); NA_Test_barrier(&na_test_lat_info->na_test_info); hg_time_get_current(&t2); time_read += hg_time_to_double(hg_time_subtract(t2, t1)); hg_request_reset(recv_request); #ifdef MERCURY_TESTING_HAS_VERIFY_DATA /* Check recv buf */ const char *recv_buf_ptr = (const char*) recv_buf; for (i = NA_Msg_get_unexpected_header_size(na_test_lat_info->na_class); i < buf_size; i++) { if (recv_buf_ptr[i] != (char) i) { fprintf(stderr, "Error detected in bulk transfer, buf[%d] = %d, " "was expecting %d!\n", (int) i, (char) recv_buf_ptr[i], (char) i); break; } } #endif /* At this point we have received everything so work out the bandwidth */ #ifdef MERCURY_TESTING_PRINT_PARTIAL read_lat = time_read * 1.0e6 / (double) ((avg_iter + 1) * 2 * (unsigned int) na_test_lat_info->na_test_info.mpi_comm_size); if (na_test_lat_info->na_test_info.mpi_comm_rank == 0) fprintf(stdout, "%-*d%*.*f\r", 10, (int) size, NWIDTH, NDIGITS, read_lat); #endif } #ifndef MERCURY_TESTING_PRINT_PARTIAL read_lat = time_read * 1.0e6 / (double) (loop * 2 * (unsigned int) na_test_lat_info->na_test_info.mpi_comm_size); if (na_test_lat_info->na_test_info.mpi_comm_rank == 0) fprintf(stdout, "%-*d%*.*f", 10, (int) size, NWIDTH, NDIGITS, read_lat); #endif if (na_test_lat_info->na_test_info.mpi_comm_rank == 0) fprintf(stdout, "\n"); done: /* Clean up resources */ hg_request_destroy(recv_request); NA_Op_destroy(na_test_lat_info->na_class, send_op_id); NA_Op_destroy(na_test_lat_info->na_class, recv_op_id); NA_Msg_buf_free(na_test_lat_info->na_class, send_buf, send_buf_data); NA_Msg_buf_free(na_test_lat_info->na_class, recv_buf, recv_buf_data); return ret; }