Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit d8396c6

Browse files
TEST: Add test suite for allreduce ring algorithm
- Add tests for various data types and reduction operations - Test edge cases with non-power-of-two team sizes and odd message sizes - Test persistent operations for stability - Test with different memory types (HOST, CUDA, CUDA_MANAGED where available) Signed-off-by: Armen Ratner <armeng@nvidia.com>
1 parent 65bc710 commit d8396c6

File tree

1 file changed

+98
-1
lines changed

1 file changed

+98
-1
lines changed

‎test/gtest/coll/test_allreduce.cc‎

Lines changed: 98 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,15 @@ template<typename T>
290290
class test_allreduce_alg : public test_allreduce<T>
291291
{};
292292

293-
using test_allreduce_alg_type = ::testing::Types<TypeOpPair<UCC_DT_INT32, sum>>;
293+
// Expanded type list for allreduce algorithm tests to cover more data types and operations
294+
using test_allreduce_alg_type = ::testing::Types<
295+
TypeOpPair<UCC_DT_INT32, sum>,
296+
TypeOpPair<UCC_DT_FLOAT32, sum>,
297+
TypeOpPair<UCC_DT_INT32, prod>,
298+
TypeOpPair<UCC_DT_INT32, max>,
299+
TypeOpPair<UCC_DT_INT32, min>,
300+
TypeOpPair<UCC_DT_FLOAT64, sum>
301+
>;
294302
TYPED_TEST_CASE(test_allreduce_alg, test_allreduce_alg_type);
295303

296304
TYPED_TEST(test_allreduce_alg, sra_knomial_pipelined) {
@@ -437,6 +445,95 @@ TYPED_TEST(test_allreduce_alg, rab_pipelined) {
437445
}
438446
}
439447

448+
TYPED_TEST(test_allreduce_alg, ring) {
449+
int n_procs = 15;
450+
// For algorithm selection, using the algorithm name (as used in the other algorithm tests)
451+
ucc_job_env_t env = {{"UCC_CL_BASIC_TUNE", "inf"},
452+
{"UCC_TL_UCP_ALLREDUCE_ALG", "ring"}};
453+
UccJob job(n_procs, UccJob::UCC_JOB_CTX_GLOBAL, env);
454+
UccTeam_h team = job.create_team(n_procs);
455+
int repeat = 3;
456+
UccCollCtxVec ctxs;
457+
std::vector<ucc_memory_type_t> mt = {UCC_MEMORY_TYPE_HOST};
458+
459+
if (UCC_OK == ucc_mc_available(UCC_MEMORY_TYPE_CUDA)) {
460+
mt.push_back(UCC_MEMORY_TYPE_CUDA);
461+
}
462+
if (UCC_OK == ucc_mc_available(UCC_MEMORY_TYPE_CUDA_MANAGED)) {
463+
mt.push_back(UCC_MEMORY_TYPE_CUDA_MANAGED);
464+
}
465+
466+
// Test with various data sizes: small, medium, large
467+
for (auto count : {8, 65536, 123567}) {
468+
for (auto inplace : {TEST_NO_INPLACE, TEST_INPLACE}) {
469+
for (auto m : mt) {
470+
SET_MEM_TYPE(m);
471+
this->set_inplace(inplace);
472+
this->data_init(n_procs, TypeParam::dt, count, ctxs, true);
473+
UccReq req(team, ctxs);
474+
475+
for (auto i = 0; i < repeat; i++) {
476+
req.start();
477+
req.wait();
478+
EXPECT_EQ(true, this->data_validate(ctxs));
479+
this->reset(ctxs);
480+
}
481+
this->data_fini(ctxs);
482+
}
483+
}
484+
}
485+
}
486+
487+
TYPED_TEST(test_allreduce_alg, ring_edge_cases) {
488+
// Test with non-power-of-two team sizes and edge cases
489+
for (auto team_size : {3, 7, 13}) {
490+
ucc_job_env_t env = {{"UCC_CL_BASIC_TUNE", "inf"},
491+
{"UCC_TL_UCP_ALLREDUCE_ALG", "ring"}};
492+
UccJob job(team_size, UccJob::UCC_JOB_CTX_GLOBAL, env);
493+
UccTeam_h team = job.create_team(team_size);
494+
UccCollCtxVec ctxs;
495+
496+
// Test edge cases: empty message, single element, and odd sizes
497+
for (auto count : {0, 1, 3, 17}) {
498+
SET_MEM_TYPE(UCC_MEMORY_TYPE_HOST);
499+
this->set_inplace(TEST_NO_INPLACE);
500+
this->data_init(team_size, TypeParam::dt, count, ctxs, false);
501+
UccReq req(team, ctxs);
502+
503+
req.start();
504+
req.wait();
505+
EXPECT_EQ(true, this->data_validate(ctxs));
506+
this->data_fini(ctxs);
507+
}
508+
}
509+
}
510+
511+
TYPED_TEST(test_allreduce_alg, ring_persistent) {
512+
// Test persistent operation - results should be consistent across multiple calls
513+
int n_procs = 8;
514+
ucc_job_env_t env = {{"UCC_CL_BASIC_TUNE", "inf"},
515+
{"UCC_TL_UCP_ALLREDUCE_ALG", "ring"}};
516+
UccJob job(n_procs, UccJob::UCC_JOB_CTX_GLOBAL, env);
517+
UccTeam_h team = job.create_team(n_procs);
518+
UccCollCtxVec ctxs;
519+
520+
SET_MEM_TYPE(UCC_MEMORY_TYPE_HOST);
521+
this->set_inplace(TEST_NO_INPLACE);
522+
// Use a larger buffer for persistent test
523+
size_t count = 1024;
524+
this->data_init(n_procs, TypeParam::dt, count, ctxs, true);
525+
UccReq req(team, ctxs);
526+
527+
// Run multiple iterations to verify persistence
528+
for (int i = 0; i < 5; i++) {
529+
req.start();
530+
req.wait();
531+
EXPECT_EQ(true, this->data_validate(ctxs));
532+
this->reset(ctxs);
533+
}
534+
this->data_fini(ctxs);
535+
}
536+
440537
#ifdef HAVE_UCX
441538
TYPED_TEST(test_allreduce_alg, sliding_window)
442539
{

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /