1616
1717#include < ucs/sys/preprocessor.h>
1818#include < ucs/sys/string.h>
19+ #include " ucs/type/status.h"
1920#include < limits>
2021
2122
@@ -733,6 +734,21 @@ class ucp_perf_test_runner : public ucp_perf_test_runner_base<uint8_t> {
733734 m_perf.ucp .self_recv_rkey );
734735 }
735736
737+ ucs_status_t validate_buffers (void *send_buffer, void *recv_buffer,
738+ size_t length)
739+ {
740+ if (CMD == UCX_PERF_CMD_PUT ) {
741+ fence ();
742+ }
743+
744+ if (memcmp (send_buffer, recv_buffer, length)) {
745+ ucs_error (" data mismatch between send and receive buffers" );
746+ return UCS_ERR_IO_ERROR ;
747+ }
748+
749+ return UCS_OK ;
750+ }
751+
736752 ucs_status_t run_pingpong ()
737753 {
738754 unsigned my_index;
@@ -744,21 +760,25 @@ class ucp_perf_test_runner : public ucp_perf_test_runner_base<uint8_t> {
744760 ucp_rkey_h rkey;
745761 size_t length, send_length, recv_length;
746762 psn_t sn;
763+ bool validate;
764+ ucs_status_t status;
747765
748766 send_buffer = m_perf.send_buffer ;
749767 recv_buffer = m_perf.recv_buffer ;
750768 worker = m_perf.ucp .worker ;
751769 ep = m_perf.ucp .ep ;
752770 remote_addr = m_perf.ucp .remote_addr ;
753771 rkey = m_perf.ucp .rkey ;
754- sn = 0 ;
772+ sn = 1 ;
755773
756774 ucp_perf_init_common_params (&length, &send_length, &send_datatype,
757775 &send_buffer, &recv_length, &recv_datatype,
758776 &recv_buffer);
759777
760778 reset_buffers (length, UNKNOWN_SN );
761779
780+ validate = m_perf.params .flags & UCX_PERF_TEST_FLAG_VALIDATE ;
781+
762782 ucp_perf_barrier (&m_perf);
763783
764784 my_index = rte_call (&m_perf, group_index);
@@ -769,16 +789,35 @@ class ucp_perf_test_runner : public ucp_perf_test_runner_base<uint8_t> {
769789
770790 if (my_index == 0 ) {
771791 UCX_PERF_TEST_FOREACH (&m_perf) {
792+
793+ if (validate) {
794+ memset (send_buffer, sn, send_length);
795+ }
796+
772797 send (ep, send_buffer, send_length, send_datatype, sn, remote_addr, rkey);
773798 recv (worker, ep, recv_buffer, recv_length, recv_datatype, sn);
774799 wait_recv_window (m_max_outstanding);
800+
801+ if (validate) {
802+ status = validate_buffers (send_buffer, recv_buffer,
803+ send_length);
804+ if (status != UCS_OK ) {
805+ return status;
806+ }
807+ }
808+
775809 ucx_perf_update (&m_perf, 1 , 1 , length);
776810 ++sn;
777811 }
778812 } else if (my_index == 1 ) {
779813 UCX_PERF_TEST_FOREACH (&m_perf) {
780814 recv (worker, ep, recv_buffer, recv_length, recv_datatype, sn);
781815 wait_recv_window (m_max_outstanding);
816+
817+ if (validate) {
818+ memcpy (send_buffer, recv_buffer, send_length);
819+ }
820+
782821 send (ep, send_buffer, send_length, send_datatype, sn,
783822 remote_addr, rkey, m_perf.current .iters == 0 );
784823 ucx_perf_update (&m_perf, 1 , 1 , length);
@@ -834,7 +873,7 @@ class ucp_perf_test_runner : public ucp_perf_test_runner_base<uint8_t> {
834873 if (m_perf.params .flags & UCX_PERF_TEST_FLAG_LOOPBACK ) {
835874 UCX_PERF_TEST_FOREACH (&m_perf) {
836875 send (ep, send_buffer, send_length, send_datatype,
837- sn, remote_addr, rkey);
876+ sn, remote_addr, rkey);
838877 recv (worker, ep, recv_buffer, recv_length, recv_datatype, sn);
839878 ucx_perf_update (&m_perf, 1 , 1 , length);
840879 ++sn;
0 commit comments