@@ -71,6 +71,20 @@ TEST_F(BufferManagerTest, InitWithZeroSlotNum)
7171 ASSERT_EQ (status.code , StatusCode::INVALID_ARGUMENT );
7272}
7373
74+ TEST_F (BufferManagerTest, InitHostWithUnalignedSlotCapacity)
75+ {
76+ BufferManager mgr;
77+ auto status = mgr.Init (" test_buffer" , MemoryType::HOST , 1000 , 10 );
78+ ASSERT_TRUE (status.ok ()) << status.message ;
79+ }
80+
81+ TEST_F (BufferManagerTest, InitDeviceWithUnalignedSlotCapacity)
82+ {
83+ BufferManager mgr;
84+ auto status = mgr.Init (" test_buffer" , MemoryType::ASCEND_DEVICE , 1000 , 10 );
85+ ASSERT_TRUE (status.ok ()) << status.message ;
86+ }
87+
7488TEST_F (BufferManagerTest, DoubleInit)
7589{
7690 BufferManager mgr;
@@ -123,12 +137,13 @@ TEST_F(BufferManagerTest, SingleAllocateAndFree)
123137 ScatterGatherEntry sge;
124138 status = mgr.Allocate (64 , sge);
125139 ASSERT_TRUE (status.ok ()) << status.message ;
126- ASSERT_NE (sge.addr , 0 );
140+ ASSERT_NE (sge.local_addr , 0 );
127141 ASSERT_EQ (sge.length , 64 );
128142 ASSERT_EQ (sge.tokenId , 0 );
129143 ASSERT_NE (sge.slot_index , UINT32_MAX );
144+ ASSERT_EQ (sge.memory_type , MemoryType::HOST );
130145
131- auto * ptr = reinterpret_cast <void *>(sge.addr );
146+ auto * ptr = reinterpret_cast <void *>(sge.local_addr );
132147 std::memset (ptr, 0xAB , 64 );
133148
134149 status = mgr.Free (sge.slot_index );
@@ -147,12 +162,12 @@ TEST_F(BufferManagerTest, MultipleAllocatesAndFrees)
147162 for (int i = 0 ; i < kCount ; ++i) {
148163 status = mgr.Allocate (128 , sges[i]);
149164 ASSERT_TRUE (status.ok ()) << " Failed at i=" << i << " : " << status.message ;
150- ASSERT_NE (sges[i].addr , 0 );
151- std::memset (reinterpret_cast <void *>(sges[i].addr ), i, 128 );
165+ ASSERT_NE (sges[i].local_addr , 0 );
166+ std::memset (reinterpret_cast <void *>(sges[i].local_addr ), i, 128 );
152167 }
153168
154169 for (int i = 0 ; i < kCount ; ++i) {
155- auto * data = reinterpret_cast <unsigned char *>(sges[i].addr );
170+ auto * data = reinterpret_cast <unsigned char *>(sges[i].local_addr );
156171 for (int j = 0 ; j < 128 ; ++j) { ASSERT_EQ (data[j], static_cast <unsigned char >(i)); }
157172 }
158173
@@ -191,10 +206,61 @@ TEST_F(BufferManagerTest, AllocateFullSlotSize)
191206 status = mgr.Allocate (1024 , sge);
192207 ASSERT_TRUE (status.ok ()) << status.message ;
193208 ASSERT_EQ (sge.length , 1024 );
209+ }
210+
211+ TEST_F (BufferManagerTest, AllocateFull4160ByteSlotCapacity)
212+ {
213+ BufferManager mgr;
214+ auto status = mgr.Init (" test_buffer" , MemoryType::HOST , 4160 , 10 );
215+ ASSERT_TRUE (status.ok ());
194216
195- std::memset (reinterpret_cast <void *>(sge.addr ), 0xFF , 1024 );
217+ ScatterGatherEntry sge;
218+ status = mgr.Allocate (4160 , sge);
219+ ASSERT_TRUE (status.ok ()) << status.message ;
220+ ASSERT_EQ (sge.length , 4160 );
221+ }
196222
197- mgr.Free (sge.slot_index );
223+ TEST_F (BufferManagerTest, AllocateExceeds4160ByteSlotCapacity)
224+ {
225+ BufferManager mgr;
226+ auto status = mgr.Init (" test_buffer" , MemoryType::HOST , 4160 , 10 );
227+ ASSERT_TRUE (status.ok ());
228+
229+ ScatterGatherEntry sge;
230+ status = mgr.Allocate (4161 , sge);
231+ ASSERT_FALSE (status.ok ());
232+ ASSERT_EQ (status.code , StatusCode::INVALID_ARGUMENT );
233+ }
234+
235+ TEST_F (BufferManagerTest, AllMemoryTypesUseAlignedSlotStride)
236+ {
237+ for (const auto type : {MemoryType::HOST , MemoryType::HOST_PINNED , MemoryType::ASCEND_DEVICE }) {
238+ BufferManager mgr;
239+ auto status = mgr.Init (" test_buffer" , type, 4160 , 2 );
240+ ASSERT_TRUE (status.ok ()) << status.message ;
241+
242+ ScatterGatherEntry first;
243+ ScatterGatherEntry second;
244+ ASSERT_TRUE (mgr.Allocate (4160 , first).ok ());
245+ ASSERT_TRUE (mgr.Allocate (4160 , second).ok ());
246+ ASSERT_EQ (second.local_addr - first.local_addr , 4160 );
247+ ASSERT_EQ (second.device_addr - first.device_addr , 4160 );
248+ }
249+ }
250+
251+ TEST_F (BufferManagerTest, FlagBufferCapacity71Uses128ByteStride)
252+ {
253+ BufferManager mgr;
254+ auto status = mgr.Init (" flag_buffer" , MemoryType::HOST_PINNED , 71 , 2 );
255+ ASSERT_TRUE (status.ok ()) << status.message ;
256+
257+ ScatterGatherEntry first;
258+ ScatterGatherEntry second;
259+ ASSERT_TRUE (mgr.Allocate (71 , first).ok ());
260+ ASSERT_TRUE (mgr.Allocate (71 , second).ok ());
261+ ASSERT_EQ (first.length , 71 );
262+ ASSERT_EQ (second.local_addr - first.local_addr , 128 );
263+ ASSERT_EQ (second.device_addr - first.device_addr , 128 );
198264}
199265
200266TEST_F (BufferManagerTest, ReuseAfterFree)
@@ -212,7 +278,7 @@ TEST_F(BufferManagerTest, ReuseAfterFree)
212278 ScatterGatherEntry sge2;
213279 status = mgr.Allocate (64 , sge2);
214280 ASSERT_TRUE (status.ok ());
215- ASSERT_EQ (sge2.addr , sge1.addr );
281+ ASSERT_EQ (sge2.local_addr , sge1.local_addr );
216282 ASSERT_EQ (sge2.slot_index , sge1.slot_index );
217283
218284 mgr.Free (sge2.slot_index );
@@ -233,7 +299,7 @@ TEST_F(BufferManagerTest, ConcurrentAllocateAndFree)
233299 auto s = mgr.Allocate (64 , sge);
234300 ASSERT_TRUE (s.ok ()) << " Thread " << thread_id << " op " << i << " : " << s.message ;
235301
236- std::memset (reinterpret_cast <void *>(sge.addr ), thread_id, 64 );
302+ std::memset (reinterpret_cast <void *>(sge.local_addr ), thread_id, 64 );
237303
238304 s = mgr.Free (sge.slot_index );
239305 ASSERT_TRUE (s.ok ()) << s.message ;
@@ -260,10 +326,10 @@ TEST_F(BufferManagerTest, ConcurrentStressTest)
260326 auto s = mgr.Allocate (128 , sge);
261327 ASSERT_TRUE (s.ok ());
262328
263- std::memset (reinterpret_cast <void *>(sge.addr ), thread_id, 128 );
329+ std::memset (reinterpret_cast <void *>(sge.local_addr ), thread_id, 128 );
264330
265331 for (int j = 0 ; j < 128 ; ++j) {
266- ASSERT_EQ (reinterpret_cast <unsigned char *>(sge.addr )[j], thread_id);
332+ ASSERT_EQ (reinterpret_cast <unsigned char *>(sge.local_addr )[j], thread_id);
267333 }
268334
269335 s = mgr.Free (sge.slot_index );
@@ -286,7 +352,7 @@ TEST_F(BufferManagerTest, FreeZeroesMemory)
286352 status = mgr.Allocate (64 , sge1);
287353 ASSERT_TRUE (status.ok ());
288354
289- auto * ptr = reinterpret_cast <uint8_t *>(sge1.addr );
355+ auto * ptr = reinterpret_cast <uint8_t *>(sge1.local_addr );
290356 std::memset (ptr, 0xAB , 1024 );
291357
292358 status = mgr.Free (sge1.slot_index );
@@ -295,10 +361,10 @@ TEST_F(BufferManagerTest, FreeZeroesMemory)
295361 ScatterGatherEntry sge2;
296362 status = mgr.Allocate (64 , sge2);
297363 ASSERT_TRUE (status.ok ());
298- ASSERT_EQ (sge2.addr , sge1.addr );
364+ ASSERT_EQ (sge2.local_addr , sge1.local_addr );
299365 ASSERT_EQ (sge2.slot_index , sge1.slot_index );
300366
301- auto * ptr2 = reinterpret_cast <uint8_t *>(sge2.addr );
367+ auto * ptr2 = reinterpret_cast <uint8_t *>(sge2.local_addr );
302368 for (size_t i = 0 ; i < 1024 ; ++i) {
303369 ASSERT_EQ (ptr2[i], 0 ) << " byte " << i << " not zeroed after free" ;
304370 }
@@ -395,6 +461,33 @@ TEST_F(BufferManagerTest, InitWithProviderRegistersMemory)
395461 ASSERT_NE (provider.lastAddr , 0 );
396462 ASSERT_EQ (provider.lastSize , 1024 * 10 );
397463 ASSERT_EQ (mgr.GetTokenId (), 42 );
464+
465+ ScatterGatherEntry sge;
466+ ASSERT_TRUE (mgr.Allocate (64 , sge).ok ());
467+ ASSERT_EQ (sge.local_addr , sge.device_addr );
468+ }
469+
470+ TEST_F (BufferManagerTest, HostPinnedRegistersDeviceAddress)
471+ {
472+ StubTransProvider provider;
473+
474+ BufferManager mgr;
475+ auto status = mgr.Init (" test_rdma_pinned" , MemoryType::HOST_PINNED , 4096 , 1 , &provider);
476+ ASSERT_TRUE (status.ok ()) << status.message ;
477+ ASSERT_EQ (provider.registerCount , 1 );
478+ ASSERT_EQ (provider.lastMemType , TransProvider::MemType::MEM_DEVICE );
479+
480+ ScatterGatherEntry sge;
481+ ASSERT_TRUE (mgr.Allocate (64 , sge).ok ());
482+ ASSERT_NE (sge.local_addr , 0 );
483+ ASSERT_NE (sge.device_addr , 0 );
484+ ASSERT_NE (sge.local_addr , sge.device_addr );
485+ ASSERT_EQ (sge.local_addr % 4096 , 0 );
486+ ASSERT_EQ (provider.lastAddr , sge.device_addr );
487+
488+ // The CPU writes through addr while HCOMM and remote RDMA use device_addr.
489+ std::memset (reinterpret_cast <void *>(sge.local_addr ), 0x5A , sge.length );
490+ ASSERT_EQ (*reinterpret_cast <unsigned char *>(sge.local_addr ), 0x5A );
398491}
399492
400493TEST_F (BufferManagerTest, InitWithProviderAllocateReturnsTokenId)
0 commit comments