1 /*
2  * Copyright (c) 2016      Mellanox Technologies, Inc.
3  *                         All rights reserved.
4  * $COPYRIGHT$
5  *
6  * Additional copyrights may follow
7  *
8  * $HEADER$
9  */
10 
11 #include "oshmem_config.h"
12 #include "oshmem/shmem/fortran/bindings.h"
13 #include "oshmem/include/shmem.h"
14 #include "oshmem/shmem/shmem_api_logger.h"
15 #include "oshmem/runtime/runtime.h"
16 #include "oshmem/mca/spml/spml.h"
17 #include "ompi/datatype/ompi_datatype.h"
18 #include "stdio.h"
19 
20 #if OSHMEM_PROFILING
21 #include "oshmem/shmem/fortran/profile/pbindings.h"
22 
SHMEM_GENERATE_WEAK_BINDINGS(SHMEM_PUTMEM_NBI,shmem_putmem_nbi)23 SHMEM_GENERATE_WEAK_BINDINGS(SHMEM_PUTMEM_NBI, shmem_putmem_nbi)
24 
25 SHMEM_GENERATE_WEAK_BINDINGS(SHMEM_CHARACTER_PUT_NBI, shmem_character_put_nbi)
26 SHMEM_GENERATE_WEAK_BINDINGS(SHMEM_COMPLEX_PUT_NBI, shmem_complex_put_nbi)
27 SHMEM_GENERATE_WEAK_BINDINGS(SHMEM_DOUBLE_PUT_NBI, shmem_double_put_nbi)
28 SHMEM_GENERATE_WEAK_BINDINGS(SHMEM_INTEGER_PUT_NBI, shmem_integer_put_nbi)
29 SHMEM_GENERATE_WEAK_BINDINGS(SHMEM_LOGICAL_PUT_NBI, shmem_logical_put_nbi)
30 SHMEM_GENERATE_WEAK_BINDINGS(SHMEM_REAL_PUT_NBI, shmem_real_put_nbi)
31 
32 SHMEM_GENERATE_WEAK_BINDINGS(SHMEM_PUT4_NBI, shmem_put4_nbi)
33 SHMEM_GENERATE_WEAK_BINDINGS(SHMEM_PUT8_NBI, shmem_put8_nbi)
34 SHMEM_GENERATE_WEAK_BINDINGS(SHMEM_PUT32_NBI, shmem_put32_nbi)
35 SHMEM_GENERATE_WEAK_BINDINGS(SHMEM_PUT64_NBI, shmem_put64_nbi)
36 SHMEM_GENERATE_WEAK_BINDINGS(SHMEM_PUT128_NBI, shmem_put128_nbi)
37 
38 #include "oshmem/shmem/fortran/profile/defines.h"
39 #endif
40 
41 SHMEM_GENERATE_FORTRAN_BINDINGS_SUB (void,
42         SHMEM_PUTMEM_NBI,
43         shmem_putmem_nbi_,
44         shmem_putmem_nbi__,
45         shmem_putmem_nbi_f,
46         (FORTRAN_POINTER_T target, FORTRAN_POINTER_T source, MPI_Fint *length, MPI_Fint *pe),
47         (target,source,length,pe) )
48 
49 void shmem_putmem_nbi_f(FORTRAN_POINTER_T target, FORTRAN_POINTER_T source, MPI_Fint *length, MPI_Fint *pe)
50 {
51     MCA_SPML_CALL(put_nb(FPTR_2_VOID_PTR(target),
52         OMPI_FINT_2_INT(*length),
53         FPTR_2_VOID_PTR(source),
54         OMPI_FINT_2_INT(*pe), NULL));
55 }
56 
57 SHMEM_GENERATE_FORTRAN_BINDINGS_SUB (void,
58         SHMEM_CHARACTER_PUT_NBI,
59         shmem_character_put_nbi_,
60         shmem_character_put_nbi__,
61         shmem_character_put_nbi_f,
62         (FORTRAN_POINTER_T target, FORTRAN_POINTER_T source, MPI_Fint *length, MPI_Fint *pe),
63         (target,source,length,pe) )
64 
shmem_character_put_nbi_f(FORTRAN_POINTER_T target,FORTRAN_POINTER_T source,MPI_Fint * length,MPI_Fint * pe)65 void shmem_character_put_nbi_f(FORTRAN_POINTER_T target, FORTRAN_POINTER_T source, MPI_Fint *length, MPI_Fint *pe)
66 {
67     size_t character_type_size = 0;
68     ompi_datatype_type_size(&ompi_mpi_character.dt, &character_type_size);
69 
70     MCA_SPML_CALL(put_nb(FPTR_2_VOID_PTR(target),
71         OMPI_FINT_2_INT(*length) * character_type_size,
72         FPTR_2_VOID_PTR(source),
73         OMPI_FINT_2_INT(*pe), NULL));
74 }
75 
76 SHMEM_GENERATE_FORTRAN_BINDINGS_SUB (void,
77         SHMEM_COMPLEX_PUT_NBI,
78         shmem_complex_put_nbi_,
79         shmem_complex_put_nbi__,
80         shmem_complex_put_nbi_f,
81         (FORTRAN_POINTER_T target, FORTRAN_POINTER_T source, MPI_Fint *length, MPI_Fint *pe),
82         (target,source,length,pe) )
83 
shmem_complex_put_nbi_f(FORTRAN_POINTER_T target,FORTRAN_POINTER_T source,MPI_Fint * length,MPI_Fint * pe)84 void shmem_complex_put_nbi_f(FORTRAN_POINTER_T target, FORTRAN_POINTER_T source, MPI_Fint *length, MPI_Fint *pe)
85 {
86     size_t complex_type_size = 0;
87     ompi_datatype_type_size(&ompi_mpi_cplex.dt, &complex_type_size);
88 
89     MCA_SPML_CALL(put_nb(FPTR_2_VOID_PTR(target),
90         OMPI_FINT_2_INT(*length) * complex_type_size,
91         FPTR_2_VOID_PTR(source),
92         OMPI_FINT_2_INT(*pe), NULL));
93 }
94 
95 SHMEM_GENERATE_FORTRAN_BINDINGS_SUB (void,
96         SHMEM_DOUBLE_PUT_NBI,
97         shmem_double_put_nbi_,
98         shmem_double_put_nbi__,
99         shmem_double_put_nbi_f,
100         (FORTRAN_POINTER_T target, FORTRAN_POINTER_T source, MPI_Fint *length, MPI_Fint *pe),
101         (target,source,length,pe) )
102 
shmem_double_put_nbi_f(FORTRAN_POINTER_T target,FORTRAN_POINTER_T source,MPI_Fint * length,MPI_Fint * pe)103 void shmem_double_put_nbi_f(FORTRAN_POINTER_T target, FORTRAN_POINTER_T source, MPI_Fint *length, MPI_Fint *pe)
104 {
105     size_t double_precision_type_size = 0;
106     ompi_datatype_type_size(&ompi_mpi_dblprec.dt, &double_precision_type_size);
107 
108     MCA_SPML_CALL(put_nb(FPTR_2_VOID_PTR(target),
109         OMPI_FINT_2_INT(*length) * double_precision_type_size,
110         FPTR_2_VOID_PTR(source),
111         OMPI_FINT_2_INT(*pe), NULL));
112 }
113 
114 SHMEM_GENERATE_FORTRAN_BINDINGS_SUB (void,
115         SHMEM_INTEGER_PUT_NBI,
116         shmem_integer_put_nbi_,
117         shmem_integer_put_nbi__,
118         shmem_integer_put_nbi_f,
119         (FORTRAN_POINTER_T target, FORTRAN_POINTER_T source, MPI_Fint *length, MPI_Fint *pe),
120         (target,source,length,pe) )
121 
shmem_integer_put_nbi_f(FORTRAN_POINTER_T target,FORTRAN_POINTER_T source,MPI_Fint * length,MPI_Fint * pe)122 void shmem_integer_put_nbi_f(FORTRAN_POINTER_T target, FORTRAN_POINTER_T source, MPI_Fint *length, MPI_Fint *pe)
123 {
124     size_t integer_type_size = 0;
125     ompi_datatype_type_size(&ompi_mpi_integer.dt, &integer_type_size);
126 
127     MCA_SPML_CALL(put_nb(FPTR_2_VOID_PTR(target),
128         OMPI_FINT_2_INT(*length) * integer_type_size,
129         FPTR_2_VOID_PTR(source),
130         OMPI_FINT_2_INT(*pe), NULL));
131 }
132 
133 SHMEM_GENERATE_FORTRAN_BINDINGS_SUB (void,
134         SHMEM_LOGICAL_PUT_NBI,
135         shmem_logical_put_nbi_,
136         shmem_logical_put_nbi__,
137         shmem_logical_put_nbi_f,
138         (FORTRAN_POINTER_T target, FORTRAN_POINTER_T source, MPI_Fint *length, MPI_Fint *pe),
139         (target,source,length,pe) )
140 
shmem_logical_put_nbi_f(FORTRAN_POINTER_T target,FORTRAN_POINTER_T source,MPI_Fint * length,MPI_Fint * pe)141 void shmem_logical_put_nbi_f(FORTRAN_POINTER_T target, FORTRAN_POINTER_T source, MPI_Fint *length, MPI_Fint *pe)
142 {
143     size_t logical_type_size = 0;
144     ompi_datatype_type_size(&ompi_mpi_logical.dt, &logical_type_size);
145 
146     MCA_SPML_CALL(put_nb(FPTR_2_VOID_PTR(target),
147         OMPI_FINT_2_INT(*length) * logical_type_size,
148         FPTR_2_VOID_PTR(source),
149         OMPI_FINT_2_INT(*pe), NULL));
150 }
151 
152 SHMEM_GENERATE_FORTRAN_BINDINGS_SUB (void,
153         SHMEM_REAL_PUT_NBI,
154         shmem_real_put_nbi_,
155         shmem_real_put_nbi__,
156         shmem_real_put_nbi_f,
157         (FORTRAN_POINTER_T target, FORTRAN_POINTER_T source, MPI_Fint *length, MPI_Fint *pe),
158         (target,source,length,pe) )
159 
shmem_real_put_nbi_f(FORTRAN_POINTER_T target,FORTRAN_POINTER_T source,MPI_Fint * length,MPI_Fint * pe)160 void shmem_real_put_nbi_f(FORTRAN_POINTER_T target, FORTRAN_POINTER_T source, MPI_Fint *length, MPI_Fint *pe)
161 {
162     size_t real_type_size = 0;
163     ompi_datatype_type_size(&ompi_mpi_real.dt, &real_type_size);
164 
165     MCA_SPML_CALL(put_nb(FPTR_2_VOID_PTR(target),
166         OMPI_FINT_2_INT(*length) * real_type_size,
167         FPTR_2_VOID_PTR(source),
168         OMPI_FINT_2_INT(*pe), NULL));
169 }
170 
171 SHMEM_GENERATE_FORTRAN_BINDINGS_SUB (void,
172         SHMEM_PUT4_NBI,
173         shmem_put4_nbi_,
174         shmem_put4_nbi__,
175         shmem_put4_nbi_f,
176         (FORTRAN_POINTER_T target, FORTRAN_POINTER_T source, MPI_Fint *length, MPI_Fint *pe),
177         (target,source,length,pe) )
178 
shmem_put4_nbi_f(FORTRAN_POINTER_T target,FORTRAN_POINTER_T source,MPI_Fint * length,MPI_Fint * pe)179 void shmem_put4_nbi_f(FORTRAN_POINTER_T target, FORTRAN_POINTER_T source, MPI_Fint *length, MPI_Fint *pe)
180 {
181     MCA_SPML_CALL(put_nb(FPTR_2_VOID_PTR(target),
182         OMPI_FINT_2_INT(*length) * 4,
183         FPTR_2_VOID_PTR(source),
184         OMPI_FINT_2_INT(*pe), NULL));
185 }
186 
187 SHMEM_GENERATE_FORTRAN_BINDINGS_SUB (void,
188         SHMEM_PUT8_NBI,
189         shmem_put8_nbi_,
190         shmem_put8_nbi__,
191         shmem_put8_nbi_f,
192         (FORTRAN_POINTER_T target, FORTRAN_POINTER_T source, MPI_Fint *length, MPI_Fint *pe),
193         (target,source,length,pe) )
194 
shmem_put8_nbi_f(FORTRAN_POINTER_T target,FORTRAN_POINTER_T source,MPI_Fint * length,MPI_Fint * pe)195 void shmem_put8_nbi_f(FORTRAN_POINTER_T target, FORTRAN_POINTER_T source, MPI_Fint *length, MPI_Fint *pe)
196 {
197     MCA_SPML_CALL(put_nb(FPTR_2_VOID_PTR(target),
198         OMPI_FINT_2_INT(*length) * 8,
199         FPTR_2_VOID_PTR(source),
200         OMPI_FINT_2_INT(*pe), NULL));
201 }
202 
203 SHMEM_GENERATE_FORTRAN_BINDINGS_SUB (void,
204         SHMEM_PUT32_NBI,
205         shmem_put32_nbi_,
206         shmem_put32_nbi__,
207         shmem_put32_nbi_f,
208         (FORTRAN_POINTER_T target, FORTRAN_POINTER_T source, MPI_Fint *length, MPI_Fint *pe),
209         (target,source,length,pe) )
210 
shmem_put32_nbi_f(FORTRAN_POINTER_T target,FORTRAN_POINTER_T source,MPI_Fint * length,MPI_Fint * pe)211 void shmem_put32_nbi_f(FORTRAN_POINTER_T target, FORTRAN_POINTER_T source, MPI_Fint *length, MPI_Fint *pe)
212 {
213     MCA_SPML_CALL(put_nb(FPTR_2_VOID_PTR(target),
214         OMPI_FINT_2_INT(*length) * 4,
215         FPTR_2_VOID_PTR(source),
216         OMPI_FINT_2_INT(*pe), NULL));
217 }
218 
219 SHMEM_GENERATE_FORTRAN_BINDINGS_SUB (void,
220         SHMEM_PUT64_NBI,
221         shmem_put64_nbi_,
222         shmem_put64_nbi__,
223         shmem_put64_nbi_f,
224         (FORTRAN_POINTER_T target, FORTRAN_POINTER_T source, MPI_Fint *length, MPI_Fint *pe),
225         (target,source,length,pe) )
226 
shmem_put64_nbi_f(FORTRAN_POINTER_T target,FORTRAN_POINTER_T source,MPI_Fint * length,MPI_Fint * pe)227 void shmem_put64_nbi_f(FORTRAN_POINTER_T target, FORTRAN_POINTER_T source, MPI_Fint *length, MPI_Fint *pe)
228 {
229     MCA_SPML_CALL(put_nb(FPTR_2_VOID_PTR(target),
230         OMPI_FINT_2_INT(*length) * 8,
231         FPTR_2_VOID_PTR(source),
232         OMPI_FINT_2_INT(*pe), NULL));
233 }
234 
235 SHMEM_GENERATE_FORTRAN_BINDINGS_SUB (void,
236         SHMEM_PUT128_NBI,
237         shmem_put128_nbi_,
238         shmem_put128_nbi__,
239         shmem_put128_nbi_f,
240         (FORTRAN_POINTER_T target, FORTRAN_POINTER_T source, MPI_Fint *length, MPI_Fint *pe),
241         (target,source,length,pe) )
242 
shmem_put128_nbi_f(FORTRAN_POINTER_T target,FORTRAN_POINTER_T source,MPI_Fint * length,MPI_Fint * pe)243 void shmem_put128_nbi_f(FORTRAN_POINTER_T target, FORTRAN_POINTER_T source, MPI_Fint *length, MPI_Fint *pe)
244 {
245     MCA_SPML_CALL(put_nb(FPTR_2_VOID_PTR(target),
246         OMPI_FINT_2_INT(*length) * 16,
247         FPTR_2_VOID_PTR(source),
248         OMPI_FINT_2_INT(*pe), NULL));
249 }
250