40 int blocksize =
sizeof(T)*length;
41 if (blocksize % 8 != 0) {
42 blocksize += (8 - blocksize%8);
46 QMP_mem_t* send_mem = QMP_allocate_aligned_memory(blocksize,
48 (QMP_MEM_COMMS|QMP_MEM_FAST));
49 if( send_mem == 0x0 ) {
53 QMP_mem_t* recv_mem = QMP_allocate_aligned_memory(blocksize,
55 (QMP_MEM_COMMS|QMP_MEM_FAST));
57 if( recv_mem == 0x0 ) {
63 void *sendmem_pointer = QMP_get_memory_pointer(send_mem);
64 void *recvmem_pointer = QMP_get_memory_pointer(recv_mem);
70 QMP_msgmem_t send_msgmem = QMP_declare_msgmem( sendmem_pointer,
73 QMP_msgmem_t recv_msgmem = QMP_declare_msgmem( recvmem_pointer,
76 QMP_msghandle_t send_handle = QMP_declare_send_relative(send_msgmem, dim, +1, 0);
79 QMP_msghandle_t recv_handle = QMP_declare_receive_relative(recv_msgmem, dim, -1, 0);
83 const int* logical_dimensions = QMP_get_logical_dimensions();
84 const int* logical_coordinates = QMP_get_logical_coordinates();
86 int procs_in_dimension = logical_dimensions[dim];
88 multi2d<T> all_data(length, procs_in_dimension);
92 memcpy(sendmem_pointer, x,
sizeof(T)*length);
95 for(
int j=0; j < length; j++) {
99 for(
int i=0; i < procs_in_dimension-1; i++) {
103 status = QMP_start(recv_handle);
104 if( status != QMP_SUCCESS ) {
109 status = QMP_start(send_handle);
110 if( status != QMP_SUCCESS ) {
115 status = QMP_wait(send_handle);
116 if( status != QMP_SUCCESS ) {
120 status = QMP_wait(recv_handle);
121 if( status != QMP_SUCCESS ) {
126 memcpy(sendmem_pointer, recvmem_pointer,
sizeof(T)*length);
128 for(
int j=0; j < length; j++) {
129 all_data(j,i+1) = ((T *)recvmem_pointer)[j];
134 for(
int j=0; j < length; j++) {
136 int my_index = logical_coordinates[dim];
137 x[j] = all_data(j, my_index);
138 for(
int i=0; i < procs_in_dimension-1; i++) {
140 my_index = (my_index + 1) % procs_in_dimension;
141 x[j] += all_data(j, my_index);
146 QMP_free_msghandle(recv_handle);
147 QMP_free_msghandle(send_handle);
148 QMP_free_msgmem(recv_msgmem);
149 QMP_free_msgmem(send_msgmem);
151 QMP_free_memory(recv_mem);
152 QMP_free_memory(send_mem);