fml  0.1-0
Fused Matrix Library
mpi_reductions.hh
1 // This file is part of fml which is released under the Boost Software
2 // License, Version 1.0. See accompanying file LICENSE or copy at
3 // https://www.boost.org/LICENSE_1_0.txt
4 
5 #ifndef FML_PAR_GPU_INTERNALS_MPI_REDUCTIONS_H
6 #define FML_PAR_GPU_INTERNALS_MPI_REDUCTIONS_H
7 #pragma once
8 
9 
10 #include "../../../gpu/card.hh"
11 #include "../comm.hh"
12 
13 
14 namespace fml
15 {
16  namespace mpi
17  {
18  template <typename REAL>
19  void allreduce_gpumem(comm &r, const int len, REAL *x_gpu)
20  {
21  r.allreduce(len, x_gpu);
22  }
23 
24 
25 
26  template <typename REAL>
27  void allreduce_cpumem(comm &r, card_sp_t c, const int len, REAL *x_gpu, REAL *x_cpu)
28  {
29  c->mem_gpu2cpu(x_cpu, x_gpu, len*sizeof(REAL));
30  r.allreduce(len, x_cpu);
31  c->mem_cpu2gpu(x_gpu, x_cpu, len*sizeof(REAL));
32  }
33 
34  template <typename REAL>
35  void allreduce_cpumem(comm &r, card_sp_t c, const int len, REAL *x_gpu)
36  {
37  REAL *x_cpu = (REAL*) std::malloc(len*sizeof(REAL));
38  if (x_cpu == NULL)
39  throw std::bad_alloc();
40 
41  c->mem_gpu2cpu(x_cpu, x_gpu, len*sizeof(REAL));
42  r.allreduce(len, x_cpu);
43  c->mem_cpu2gpu(x_gpu, x_cpu, len*sizeof(REAL));
44 
45  std::free(x_cpu);
46  }
47  }
48 }
49 
50 
51 #endif
fml
Core namespace.
Definition: dimops.hh:10