@@ -41,6 +41,11 @@ UccProcess::~UccProcess()
41
41
{
42
42
EXPECT_EQ (UCC_OK, ucc_context_destroy (ctx_h));
43
43
EXPECT_EQ (UCC_OK, ucc_finalize (lib_h));
44
+ if (ctx_params.mask & UCC_CONTEXT_PARAM_FIELD_MEM_PARAMS) {
45
+ for (auto i = 0 ; i < UCC_TEST_N_MEM_SEGMENTS; i++) {
46
+ ucc_free (onesided_buf[i]);
47
+ }
48
+ }
44
49
}
45
50
46
51
ucc_status_t UccTeam::allgather (void *src_buf, void *recv_buf, size_t size,
@@ -157,7 +162,8 @@ uint64_t rank_map_cb(uint64_t ep, void *cb_ctx) {
157
162
return (uint64_t )team->procs [(int )ep].p .get ()->job_rank ;
158
163
}
159
164
160
- void UccTeam::init_team (bool use_team_ep_map, bool use_ep_range)
165
+ void UccTeam::init_team (bool use_team_ep_map, bool use_ep_range,
166
+ bool is_onesided)
161
167
{
162
168
ucc_team_params_t team_params;
163
169
std::vector<allgather_coll_info_t *> cis;
@@ -189,6 +195,10 @@ void UccTeam::init_team(bool use_team_ep_map, bool use_ep_range)
189
195
team_params.oob .oob_ep = i;
190
196
team_params.mask |= UCC_TEAM_PARAM_FIELD_OOB;
191
197
}
198
+ if (is_onesided) {
199
+ team_params.mask |= UCC_TEAM_PARAM_FIELD_FLAGS;
200
+ team_params.flags = UCC_TEAM_FLAG_COLL_WORK_BUFFER;
201
+ }
192
202
EXPECT_EQ (UCC_OK,
193
203
ucc_team_create_post (&(procs[i].p .get ()->ctx_h ), 1 , &team_params,
194
204
&(procs[i].team )));
@@ -211,7 +221,6 @@ void UccTeam::init_team(bool use_team_ep_map, bool use_ep_range)
211
221
}
212
222
}
213
223
214
-
215
224
void UccTeam::destroy_team ()
216
225
{
217
226
ucc_status_t status;
@@ -241,7 +250,7 @@ void UccTeam::progress()
241
250
}
242
251
243
252
UccTeam::UccTeam (std::vector<UccProcess_h> &_procs, bool use_team_ep_map,
244
- bool use_ep_range)
253
+ bool use_ep_range, bool is_onesided )
245
254
{
246
255
n_procs = _procs.size ();
247
256
ag.resize (n_procs);
@@ -252,7 +261,7 @@ UccTeam::UccTeam(std::vector<UccProcess_h> &_procs, bool use_team_ep_map,
252
261
a.phase = AG_INIT;
253
262
}
254
263
copy_complete_count = 0 ;
255
- init_team (use_team_ep_map, use_ep_range);
264
+ init_team (use_team_ep_map, use_ep_range, is_onesided );
256
265
// test_allgather(128);
257
266
}
258
267
@@ -293,7 +302,6 @@ UccJob::UccJob(int _n_procs, ucc_job_ctx_mode_t _ctx_mode, ucc_job_env_t vars) :
293
302
/* restore original env */
294
303
setenv (v.first .c_str (), v.second .c_str (), 1 );
295
304
}
296
-
297
305
}
298
306
299
307
void thread_allgather (void *src_buf, void *recv_buf, size_t size,
@@ -391,13 +399,61 @@ void proc_context_create(UccProcess_h proc, int id, ThreadAllgather *ta, bool is
391
399
throw std::runtime_error (err_msg.str ());
392
400
}
393
401
402
+ void proc_context_create_mem_params (UccProcess_h proc, int id,
403
+ ThreadAllgather *ta)
404
+ {
405
+ ucc_status_t status;
406
+ ucc_context_config_h ctx_config;
407
+ std::stringstream err_msg;
408
+ ucc_mem_map_t map[UCC_TEST_N_MEM_SEGMENTS];
409
+
410
+ status = ucc_context_config_read (proc->lib_h , NULL , &ctx_config);
411
+ if (status != UCC_OK) {
412
+ err_msg << " ucc_context_config_read failed" ;
413
+ goto exit_err;
414
+ }
415
+ for (auto i = 0 ; i < UCC_TEST_N_MEM_SEGMENTS; i++) {
416
+ proc->onesided_buf [i] =
417
+ ucc_calloc (UCC_TEST_MEM_SEGMENT_SIZE, 1 , " onesided_buffer" );
418
+ EXPECT_NE (proc->onesided_buf [i], nullptr );
419
+ map[i].address = proc->onesided_buf [i];
420
+ map[i].len = UCC_TEST_MEM_SEGMENT_SIZE;
421
+ }
422
+ proc->ctx_params .mask = UCC_CONTEXT_PARAM_FIELD_OOB;
423
+ proc->ctx_params .mask |= UCC_CONTEXT_PARAM_FIELD_MEM_PARAMS;
424
+ proc->ctx_params .oob .allgather = thread_allgather_start;
425
+ proc->ctx_params .oob .req_test = thread_allgather_req_test;
426
+ proc->ctx_params .oob .req_free = thread_allgather_req_free;
427
+ proc->ctx_params .oob .coll_info = (void *)&ta->reqs [id];
428
+ proc->ctx_params .oob .n_oob_eps = ta->n_procs ;
429
+ proc->ctx_params .oob .oob_ep = id;
430
+ proc->ctx_params .mem_params .segments = map;
431
+ proc->ctx_params .mem_params .n_segments = UCC_TEST_N_MEM_SEGMENTS;
432
+ status = ucc_context_create (proc->lib_h , &proc->ctx_params , ctx_config,
433
+ &proc->ctx_h );
434
+ ucc_context_config_release (ctx_config);
435
+ if (status != UCC_OK) {
436
+ err_msg << " ucc_context_create for one-sided context failed" ;
437
+ goto exit_err;
438
+ }
439
+ return ;
440
+
441
+ exit_err:
442
+ err_msg << " : " << ucc_status_string (status) << " (" << status << " )" ;
443
+ throw std::runtime_error (err_msg.str ());
444
+ }
394
445
395
446
void UccJob::create_context ()
396
447
{
397
448
std::vector<std::thread> workers;
398
449
for (auto i = 0 ; i < procs.size (); i++) {
399
- workers.push_back (std::thread (proc_context_create, procs[i], i, &ta,
400
- ctx_mode == UCC_JOB_CTX_GLOBAL));
450
+ if (ctx_mode == UCC_JOB_CTX_GLOBAL_ONESIDED) {
451
+ workers.push_back (
452
+ std::thread (proc_context_create_mem_params, procs[i], i, &ta));
453
+ } else {
454
+ workers.push_back (std::thread (proc_context_create, procs[i], i, &ta,
455
+ ctx_mode == UCC_JOB_CTX_GLOBAL));
456
+ }
401
457
}
402
458
for (auto i = 0 ; i < procs.size (); i++) {
403
459
workers[i].join ();
@@ -464,28 +520,29 @@ void UccJob::cleanup()
464
520
}
465
521
466
522
UccTeam_h UccJob::create_team (int _n_procs, bool use_team_ep_map,
467
- bool use_ep_range)
523
+ bool use_ep_range, bool is_onesided )
468
524
{
469
525
EXPECT_GE (n_procs, _n_procs);
470
526
std::vector<UccProcess_h> team_procs;
471
- for (int i= 0 ; i< _n_procs; i++) {
527
+ for (int i = 0 ; i < _n_procs; i++) {
472
528
team_procs.push_back (procs[i]);
473
529
}
474
- return std::make_shared<UccTeam>(team_procs, use_team_ep_map, use_ep_range);
530
+ return std::make_shared<UccTeam>(team_procs, use_team_ep_map, use_ep_range,
531
+ is_onesided);
475
532
}
476
533
477
534
UccTeam_h UccJob::create_team (std::vector<int > &ranks, bool use_team_ep_map,
478
- bool use_ep_range)
535
+ bool use_ep_range, bool is_onesided )
479
536
{
480
537
EXPECT_GE (n_procs, ranks.size ());
481
538
std::vector<UccProcess_h> team_procs;
482
- for (int i= 0 ; i< ranks.size (); i++) {
539
+ for (int i = 0 ; i < ranks.size (); i++) {
483
540
team_procs.push_back (procs[ranks[i]]);
484
541
}
485
- return std::make_shared<UccTeam>(team_procs, use_team_ep_map, use_ep_range);
542
+ return std::make_shared<UccTeam>(team_procs, use_team_ep_map, use_ep_range,
543
+ is_onesided);
486
544
}
487
545
488
-
489
546
UccReq::UccReq (UccTeam_h _team, ucc_coll_args_t *args) :
490
547
team(_team)
491
548
{
0 commit comments