This source file includes following definitions.
- mca_common_ompio_check_gpu_buf
- mca_common_ompio_buffer_alloc_seg
- mca_common_ompio_buffer_free_seg
- mca_common_ompio_buffer_alloc_init
- mca_common_ompio_buffer_alloc_fini
- mca_common_ompio_alloc_buf
- mca_common_ompio_release_buf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 #include "ompi_config.h"
21
22 #include "opal/datatype/opal_convertor.h"
23 #include "opal/datatype/opal_datatype_cuda.h"
24 #include "opal/mca/common/cuda/common_cuda.h"
25 #include "opal/util/sys_limits.h"
26
27 #include "opal/mca/allocator/allocator.h"
28 #include "opal/mca/allocator/base/base.h"
29 #include "common_ompio.h"
30 #include "common_ompio_buffer.h"
31
32
33 static opal_mutex_t mca_common_ompio_buffer_mutex;
34 static mca_allocator_base_component_t* mca_common_ompio_allocator_component=NULL;
35 static mca_allocator_base_module_t* mca_common_ompio_allocator=NULL;
36
37 static opal_atomic_int32_t mca_common_ompio_buffer_init = 0;
38 static int32_t mca_common_ompio_pagesize=4096;
39 static void* mca_common_ompio_buffer_alloc_seg ( void *ctx, size_t *size );
40 static void mca_common_ompio_buffer_free_seg ( void *ctx, void *buf );
41
42 #if OPAL_CUDA_SUPPORT
43 void mca_common_ompio_check_gpu_buf ( ompio_file_t *fh, const void *buf, int *is_gpu,
44 int *is_managed)
45 {
46 opal_convertor_t convertor;
47
48 *is_gpu=0;
49 *is_managed=0;
50
51 convertor.flags=0;
52 if ( opal_cuda_check_one_buf ( (char *)buf, &convertor ) ) {
53 *is_gpu = 1;
54 if ( convertor.flags & CONVERTOR_CUDA_UNIFIED ){
55 *is_managed =1;
56 }
57 }
58
59 return;
60 }
61 #endif
62
63 static void* mca_common_ompio_buffer_alloc_seg ( void*ctx, size_t *size )
64 {
65 char *buf=NULL;
66 size_t realsize, numpages;
67
68 numpages = (*size + mca_common_ompio_pagesize -1 )/mca_common_ompio_pagesize;
69 realsize = numpages * mca_common_ompio_pagesize;
70
71 buf = malloc ( realsize);
72 #if OPAL_CUDA_SUPPORT
73 if ( NULL != buf ) {
74 mca_common_cuda_register ( ( char *)buf, realsize, NULL );
75 }
76 #endif
77 *size = realsize;
78 return buf;
79 }
80
81 static void mca_common_ompio_buffer_free_seg ( void *ctx, void *buf )
82 {
83 if ( NULL != buf ) {
84 #if OPAL_CUDA_SUPPORT
85 mca_common_cuda_unregister ( (char *) buf, NULL );
86 #endif
87 free ( buf );
88 }
89 return;
90 }
91
92 int mca_common_ompio_buffer_alloc_init ( void )
93 {
94 bool thread_safe=true;
95
96 if(OPAL_THREAD_ADD_FETCH32(&mca_common_ompio_buffer_init, 1) > 1)
97 return OMPI_SUCCESS;
98
99
100 OBJ_CONSTRUCT(&mca_common_ompio_buffer_mutex, opal_mutex_t);
101
102 OPAL_THREAD_LOCK (&mca_common_ompio_buffer_mutex );
103
104 if(NULL == (mca_common_ompio_allocator_component = mca_allocator_component_lookup("basic"))) {
105 OPAL_THREAD_UNLOCK(&mca_common_ompio_buffer_mutex);
106 return OMPI_ERR_BUFFER;
107 }
108
109
110 mca_common_ompio_allocator = mca_common_ompio_allocator_component->allocator_init(thread_safe,
111 mca_common_ompio_buffer_alloc_seg,
112 mca_common_ompio_buffer_free_seg,
113 NULL);
114 if(NULL == mca_common_ompio_allocator) {
115 OPAL_THREAD_UNLOCK(&mca_common_ompio_buffer_mutex);
116 return OMPI_ERR_BUFFER;
117 }
118
119 mca_common_ompio_pagesize = opal_getpagesize();
120
121 OPAL_THREAD_UNLOCK(&mca_common_ompio_buffer_mutex);
122 return OMPI_SUCCESS;
123 }
124
125 int mca_common_ompio_buffer_alloc_fini ( void )
126 {
127 if ( NULL != mca_common_ompio_allocator ) {
128 OPAL_THREAD_LOCK (&mca_common_ompio_buffer_mutex);
129 mca_common_ompio_allocator->alc_finalize(mca_common_ompio_allocator);
130 mca_common_ompio_allocator=NULL;
131 OPAL_THREAD_UNLOCK (&mca_common_ompio_buffer_mutex);
132 OBJ_DESTRUCT (&mca_common_ompio_buffer_mutex);
133 }
134
135 return OMPI_SUCCESS;
136 }
137
138 void *mca_common_ompio_alloc_buf ( ompio_file_t *fh, size_t bufsize )
139 {
140 char *tmp=NULL;
141
142 if ( !mca_common_ompio_buffer_init ){
143 mca_common_ompio_buffer_alloc_init ();
144 }
145
146 OPAL_THREAD_LOCK (&mca_common_ompio_buffer_mutex);
147 tmp = mca_common_ompio_allocator->alc_alloc (mca_common_ompio_allocator,
148 bufsize, 0 );
149 OPAL_THREAD_UNLOCK (&mca_common_ompio_buffer_mutex);
150 return tmp;
151 }
152
153 void mca_common_ompio_release_buf ( ompio_file_t *fh, void *buf )
154 {
155
156 if ( !mca_common_ompio_buffer_init ){
157
158
159
160 opal_output (1, "error in mca_common_ompio_release_buf: allocator not initialized\n");
161 }
162
163 OPAL_THREAD_LOCK (&mca_common_ompio_buffer_mutex);
164 mca_common_ompio_allocator->alc_free (mca_common_ompio_allocator,
165 buf);
166 OPAL_THREAD_UNLOCK (&mca_common_ompio_buffer_mutex);
167
168 return;
169 }
170