1111#include " tuner/nccl_ofi_tuner_region.h"
1212#include " nccl_ofi_param.h"
1313
14+ using std::abs;
15+ using std::log2;
16+ using std::pow;
17+ const double eps = 1e-4 ;
18+
1419static int test_extend_region (void )
1520{
1621 nccl_ofi_tuner_point_t extended_point;
@@ -21,8 +26,9 @@ static int test_extend_region(void)
2126 extended_point = extend_region ((nccl_ofi_tuner_point_t ){2 , 8 },
2227 (nccl_ofi_tuner_point_t ){4 , 8 },
2328 (nccl_ofi_tuner_point_t ){TUNER_MAX_SIZE, TUNER_MAX_RANKS});
24- if (extended_point.x != TUNER_MAX_SIZE || extended_point.y != 8 ) {
25- printf (" X-Axis Extend Test Failed : Extended Points : x = %f y = %f\n " , extended_point.x , extended_point.y );
29+ if (abs (extended_point.x - TUNER_MAX_SIZE) > eps || extended_point.y != 8 ) {
30+ printf (" X-Axis Extend Test Failed : Extended Points : x = %f (diff = %f) y = %f\n " , extended_point.x ,
31+ extended_point.x - TUNER_MAX_SIZE, extended_point.y );
2632 return -1 ;
2733 }
2834
@@ -39,22 +45,26 @@ static int test_extend_region(void)
3945 extended_point = extend_region ((nccl_ofi_tuner_point_t ){8 , 64 },
4046 (nccl_ofi_tuner_point_t ){8290304 , 72 },
4147 (nccl_ofi_tuner_point_t ){TUNER_MAX_SIZE, TUNER_MAX_RANKS});
42- slope = (72.0 - 64.0 ) / (8290304.0 - 8.0 ); // slope = (y2 - y1)/(x2 - x1)
48+ slope = (72.0 - 64.0 ) / (log2 ( 8290304.0 ) - log2 ( 8.0 ) ); // slope = (y2 - y1)/(x2 - x1)
4349 // y3 = mx3 + c and substitute for m=(y2-y1)/(x2-x1) and c = y2 - mx2
44- projected_y = 72.0 + slope * (TUNER_MAX_SIZE - 8290304.0 ); // y3 = y2 + mx3 - mx2
45- if (extended_point.x != TUNER_MAX_SIZE || extended_point.y != projected_y) {
46- printf (" X-Axis Upper Bound Test Failed : Extended Points : x = %f y = %f\n " , extended_point.x , extended_point.y );
50+ projected_y = 72.0 + slope * (log2 (TUNER_MAX_SIZE) - log2 (8290304.0 )); // y3 = y2 + mx3 - mx2
51+ if (abs (extended_point.x - TUNER_MAX_SIZE) > eps || extended_point.y != projected_y) {
52+ printf (" X-Axis Upper Bound Test Failed : Extended Points : x = %f (diff = %f) y = %f (diff = %f) \n " ,
53+ extended_point.x , extended_point.x - TUNER_MAX_SIZE,
54+ extended_point.y , extended_point.y - projected_y);
4755 return -1 ;
4856 }
4957
5058 /* Extend the line to TUNER_MAX_RANKS (y-axis) */
5159 extended_point = extend_region ((nccl_ofi_tuner_point_t ){8 , 64 },
52- (nccl_ofi_tuner_point_t ){16 , 1024 },
60+ (nccl_ofi_tuner_point_t ){8.01 , 1024 },
5361 (nccl_ofi_tuner_point_t ){TUNER_MAX_SIZE, TUNER_MAX_RANKS});
54- slope = (1024.0 - 64.0 ) / (16.0 - 8.0 );
55- projected_x = ((TUNER_MAX_RANKS - 1024.0 ) / slope) + 16 ;
56- if (extended_point.x != projected_x || extended_point.y != TUNER_MAX_RANKS) {
57- printf (" X-Axis Upper Bound Test Failed : Extended Points : x = %f y = %f\n " , extended_point.x , extended_point.y );
62+ slope = (1024.0 - 64.0 ) / (log2 (8.01 ) - log2 (8.0 ));
63+ projected_x = pow (2 , ((TUNER_MAX_RANKS - 1024.0 ) / slope) + log2 (8.01 ));
64+ if (abs (extended_point.x - projected_x) > eps || extended_point.y != TUNER_MAX_RANKS) {
65+ printf (" X-Axis Upper Bound Test 2 Failed : Extended Points : x = %f (diff = %f) y = %f (diff = %f) \n " ,
66+ extended_point.x , extended_point.x - projected_x,
67+ extended_point.y , extended_point.y - TUNER_MAX_RANKS);
5868 return -1 ;
5969 }
6070
@@ -75,7 +85,7 @@ static int test_extend_region(void)
7585| . |
7686| . |
7787|--------*------*----------*----------*---------*--------*---
78- | p3(4M, 2) |p4 (TUNER_MAX_SIZE, 2))
88+ | p3(4M, 2) |p5 (TUNER_MAX_SIZE, 2))
7989| |
8090*/
8191static int test_is_inside_region (void ) {
@@ -87,6 +97,14 @@ static int test_is_inside_region(void) {
8797 (nccl_ofi_tuner_point_t ){(double )48.0 * 1024 * 1024 , 16 },
8898 (nccl_ofi_tuner_point_t ){(double )288.0 * 1024 * 1024 , 128 },
8999 (nccl_ofi_tuner_point_t ){TUNER_MAX_SIZE, TUNER_MAX_RANKS});
100+ printf (" INFO extended point: %f %f \n " , e_48M_16_288M_128.x , e_48M_16_288M_128.y );
101+
102+ p1_288M_128.transform_log2_x ();
103+ p2_38M_16.transform_log2_x ();
104+ p3_4M_2.transform_log2_x ();
105+ p5_maxM_2.transform_log2_x ();
106+ e_48M_16_288M_128.transform_log2_x ();
107+ printf (" INFO extended point after transform_log2_x: %f %f \n " , e_48M_16_288M_128.x , e_48M_16_288M_128.y );
90108
91109 nccl_ofi_tuner_region_t region = {
92110 .algorithm = NCCL_ALGO_RING,
@@ -98,6 +116,7 @@ static int test_is_inside_region(void) {
98116 p3_4M_2,
99117 p5_maxM_2}};
100118
119+
101120 /* Points on the vertices of the polygon should be classified to be on the edge of the region */
102121 if (is_inside_region (e_48M_16_288M_128, ®ion) != 0 )
103122 return -1 ;
@@ -116,15 +135,17 @@ static int test_is_inside_region(void) {
116135 To find the points on the edge of the polygons:
117136 1. Consider two vertices of the polygon
118137 2. Calculate the slope and y-intercept of the line.
119- 3. Using the equation y = mx + c, get multiple points on the line in powers of 2.
138+ 3. Using the equation y = m * x + c, get multiple points on the line in powers of 2.
120139 */
121140 for (size_t i = 0 ; i < region.num_vertices ; i++) {
122141 size_t k = (i + 1 ) % region.num_vertices ;
123142 double slope = (region.vertices [k].y - region.vertices [i].y ) / (region.vertices [k].x - region.vertices [i].x );
124143 double c = region.vertices [k].y - (slope * (region.vertices [i].x ));
125144 for (double x = region.vertices [i].x ; x < region.vertices [k].x ; x = x * 2 ) {
126145 double y = (slope * x) + c;
127- if (is_inside_region ((nccl_ofi_tuner_point_t ){x, y}, ®ion) != 0 )
146+ nccl_ofi_tuner_point_t test_point {x, y, nccl_ofi_tuner_point_t ::X_LOG2};
147+
148+ if (is_inside_region (test_point, ®ion) != 0 )
128149 return -1 ;
129150 // printf(" Is (%.10f, %.10f) inside the region : %d\n", x, y, is_inside_region(
130151 // (nccl_ofi_tuner_point_t){x, y}, ®ion));
@@ -133,8 +154,8 @@ static int test_is_inside_region(void) {
133154
134155 printf (" All points on the edges of the polygon are detected correcltly\n " );
135156
136- size_t num_points = 20 ;
137- const nccl_ofi_tuner_point_t inside_vertices[] = {{16.0 * 1024 * 1024 , 4 },
157+ const size_t num_points = 20 ;
158+ nccl_ofi_tuner_point_t inside_vertices[] = {{16.0 * 1024 * 1024 , 4 },
138159 {128.0 * 1024 * 1024 , 4 },
139160 {1.0 * 1024 * 1024 * 1024 , 4 },
140161 {4.0 * 1024 * 1024 * 1024 , 4 },
@@ -152,25 +173,30 @@ static int test_is_inside_region(void) {
152173 {32.0 * 1024 * 1024 * 1024 , 128 },
153174 {64.0 * 1024 * 1024 * 1024 , 128 },
154175 {64.0 * 1024 * 1024 * 1024 , 256 },
155- {TUNER_MAX_SIZE - 1.0 , 128 },
156- {e_48M_16_288M_128.x - 1.0 , e_48M_16_288M_128.y - 1.0 }};
176+ // Note, set a big enough diff (10.0) below, otherwise
177+ // the delta after log2 is within floating error (eps).
178+ {TUNER_MAX_SIZE - 10.0 , 128 },
179+ {e_48M_16_288M_128.x - 0.1 , e_48M_16_288M_128.y - 10.0 , nccl_ofi_tuner_point_t ::X_LOG2}};
157180
158181 /* These points should be inside the polygon */
159182 for (size_t i = 0 ; i < num_points; i++) {
160- if (is_inside_region (inside_vertices[i], ®ion) != 1 ) {
161- printf (" %.10f, %.10f\n " , inside_vertices[i].x , inside_vertices[i].y );
183+ inside_vertices[i].transform_log2_x ();
184+ int d = is_inside_region (inside_vertices[i], ®ion);
185+ if (d != 1 ) {
186+ printf (" %ld: %.10f, %.10f is_inside_region: %d\n " , i, inside_vertices[i].x , inside_vertices[i].y , d);
162187 return -1 ;
163188 };
164189 }
165190
166191 printf (" All points inside the polygon are detected correcltly\n " );
167192
168- const nccl_ofi_tuner_point_t outside_vertices[] = {{8.0 * 1024 * 1024 , 4 },
193+ const size_t outside_num_points = 24 ;
194+ const nccl_ofi_tuner_point_t outside_vertices[] = {{8.0 * 1024 * 1024 , 6 },
169195 {8.0 * 1024 * 1024 , 32 },
170196 {8.0 * 1024 * 1024 , 128 },
171197 {8.0 * 1024 * 1024 , 512 },
172198 {8.0 * 1024 * 1024 , TUNER_MAX_RANKS},
173- {16.0 * 1024 * 1024 , 8 },
199+ {16.0 * 1024 * 1024 , 10 },
174200 {16.0 * 1024 * 1024 , 32 },
175201 {16.0 * 1024 * 1024 , 128 },
176202 {16.0 * 1024 * 1024 , 512 },
@@ -180,7 +206,7 @@ static int test_is_inside_region(void) {
180206 {32.0 * 1024 * 1024 , 64 },
181207 {32.0 * 1024 * 1024 , 128 },
182208 {32.0 * 1024 * 1024 , 256 },
183- {64 * 1024 * 1024 , 32 },
209+ {64 * 1024 * 1024 , 35 },
184210 {64.0 * 1024 * 1024 , 64 },
185211 {64.0 * 1024 * 1024 , 256 },
186212 {64.0 * 1024 * 1024 , 1024 },
@@ -191,9 +217,10 @@ static int test_is_inside_region(void) {
191217 {e_48M_16_288M_128.x + 1.0 , e_48M_16_288M_128.y + 1.0 }};
192218
193219 /* These points should be outside the polygons */
194- for (size_t i = 0 ; i < num_points; i++) {
195- if (is_inside_region (outside_vertices[i], ®ion) != -1 ) {
196- printf (" %.10f, %.10f\n " , outside_vertices[i].x , outside_vertices[i].y );
220+ for (size_t i = 0 ; i < outside_num_points; i++) {
221+ int d = is_inside_region (outside_vertices[i], ®ion);
222+ if ( d != -1 ) {
223+ printf (" %ld: %.10f, %.10f is_inside_region: %d\n " , i, outside_vertices[i].x , outside_vertices[i].y , d);
197224 return -1 ;
198225 };
199226 }
0 commit comments