Skip to content

Commit 8d8c474

Browse files
committed
update interface of virtual memory
Signed-off-by: Ceng <441651826@qq.com>
1 parent 349d986 commit 8d8c474

File tree

6 files changed

+129
-162
lines changed

6 files changed

+129
-162
lines changed

include/infinirt.h

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -54,18 +54,15 @@ __C __export infiniStatus_t infinirtMallocAsync(void **p_ptr, size_t size, infin
5454
__C __export infiniStatus_t infinirtFreeAsync(void *ptr, infinirtStream_t stream);
5555

5656
// Virtual memory & physical memory
57-
typedef void *infinirtDeviceptr_t;
58-
typedef void *infinirtAllocationHandle_t;
59-
typedef void *infinirtPhyMem_t;
60-
typedef void *infinirtVirtualMem_t;
57+
typedef void *infinirtPhysicalMemoryHandle_t;
6158

6259
__C __export infiniStatus_t infinirtGetMemGranularityMinimum(size_t *granularity);
63-
__C __export infiniStatus_t infinirtCreatePhysicalMem(infinirtPhyMem_t *phy_mem, size_t len);
64-
__C __export infiniStatus_t infinirtReleasePhysicalMem(infinirtPhyMem_t phy_mem);
60+
__C __export infiniStatus_t infinirtCreatePhysicalMem(infinirtPhysicalMemoryHandle_t *pm_handle, size_t len);
61+
__C __export infiniStatus_t infinirtReleasePhysicalMem(infinirtPhysicalMemoryHandle_t pm_handle);
6562

66-
__C __export infiniStatus_t infinirtCreateVirtualMem(infinirtVirtualMem_t *vm, size_t len);
67-
__C __export infiniStatus_t infinirtMapVirtualMem(void **mapped_ptr, infinirtVirtualMem_t vm, size_t offset, infinirtPhyMem_t phy_mem);
68-
__C __export infiniStatus_t infinirtUnmapVirtualMem(infinirtVirtualMem_t vm, size_t offset);
69-
__C __export infiniStatus_t infinirtReleaseVirtualMem(infinirtVirtualMem_t vm);
63+
__C __export infiniStatus_t infinirtCreateVirtualMem(void **vm, size_t len);
64+
__C __export infiniStatus_t infinirtMapVirtualMem(void *vm, size_t len, size_t offset, infinirtPhysicalMemoryHandle_t pm_handle);
65+
__C __export infiniStatus_t infinirtUnmapVirtualMem(void *vm, size_t len);
66+
__C __export infiniStatus_t infinirtReleaseVirtualMem(void *vm, size_t len);
7067

7168
#endif // __INFINIRT_API_H__

src/infinirt-test/test.cc

Lines changed: 75 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <cstring>
44
#include <infinirt.h>
55
#include <iostream>
6+
#include <memory>
67
#include <numeric>
78
#include <vector>
89

@@ -111,7 +112,7 @@ bool testVirtualMem(infiniDevice_t device, int deviceId) {
111112
// Test 1: Basic virtual memory allocation and release
112113
{
113114
std::cout << "\nTest 1: Basic virtual memory allocation and release" << std::endl;
114-
infinirtVirtualMem_t vm;
115+
void *vm;
115116
size_t vm_len = 10 * min_granularity;
116117
if (infinirtCreateVirtualMem(&vm, vm_len) != INFINI_STATUS_SUCCESS) {
117118
std::cerr << "Failed to reserve virtual memory" << std::endl;
@@ -120,7 +121,7 @@ bool testVirtualMem(infiniDevice_t device, int deviceId) {
120121
std::cout << "Virtual memory reserved: " << vm_len << " bytes" << std::endl;
121122

122123
// Release virtual memory
123-
if (infinirtReleaseVirtualMem(vm) != INFINI_STATUS_SUCCESS) {
124+
if (infinirtReleaseVirtualMem(vm, vm_len) != INFINI_STATUS_SUCCESS) {
124125
std::cerr << "Failed to release virtual memory" << std::endl;
125126
return false;
126127
}
@@ -130,15 +131,15 @@ bool testVirtualMem(infiniDevice_t device, int deviceId) {
130131
// Test 2: Physical memory allocation and release
131132
{
132133
std::cout << "\nTest 2: Physical memory allocation and release" << std::endl;
133-
infinirtPhyMem_t phy_mem;
134-
if (infinirtCreatePhysicalMem(&phy_mem, min_granularity) != INFINI_STATUS_SUCCESS) {
134+
infinirtPhysicalMemoryHandle_t pm_handle;
135+
if (infinirtCreatePhysicalMem(&pm_handle, min_granularity) != INFINI_STATUS_SUCCESS) {
135136
std::cerr << "Failed to create physical memory" << std::endl;
136137
return false;
137138
}
138139
std::cout << "Physical memory created: " << min_granularity << " bytes" << std::endl;
139140

140141
// Release physical memory
141-
if (infinirtReleasePhysicalMem(phy_mem) != INFINI_STATUS_SUCCESS) {
142+
if (infinirtReleasePhysicalMem(pm_handle) != INFINI_STATUS_SUCCESS) {
142143
std::cerr << "Failed to release physical memory" << std::endl;
143144
return false;
144145
}
@@ -150,23 +151,22 @@ bool testVirtualMem(infiniDevice_t device, int deviceId) {
150151
std::cout << "\nTest 3: Virtual memory mapping and data verification" << std::endl;
151152

152153
// Create virtual memory regions
153-
infinirtVirtualMem_t vm1, vm2;
154+
void *vm1, *vm2;
154155
size_t vm_len = 10 * min_granularity;
155156
if (infinirtCreateVirtualMem(&vm1, vm_len) != INFINI_STATUS_SUCCESS || infinirtCreateVirtualMem(&vm2, 2 * min_granularity) != INFINI_STATUS_SUCCESS) {
156157
std::cerr << "Failed to create virtual memory regions" << std::endl;
157158
return false;
158159
}
159160

160161
// Create physical memory
161-
infinirtPhyMem_t phy_mem;
162-
if (infinirtCreatePhysicalMem(&phy_mem, min_granularity) != INFINI_STATUS_SUCCESS) {
162+
infinirtPhysicalMemoryHandle_t pm_handle;
163+
if (infinirtCreatePhysicalMem(&pm_handle, min_granularity) != INFINI_STATUS_SUCCESS) {
163164
std::cerr << "Failed to create physical memory" << std::endl;
164165
return false;
165166
}
166167

167168
// Map physical memory to both virtual memory regions
168-
void *mapped_ptr1, *mapped_ptr2;
169-
if (infinirtMapVirtualMem(&mapped_ptr1, vm1, min_granularity, phy_mem) != INFINI_STATUS_SUCCESS || infinirtMapVirtualMem(&mapped_ptr2, vm2, min_granularity, phy_mem) != INFINI_STATUS_SUCCESS) {
169+
if (infinirtMapVirtualMem(vm1, min_granularity, 0, pm_handle) != INFINI_STATUS_SUCCESS || infinirtMapVirtualMem(vm2, min_granularity, 0, pm_handle) != INFINI_STATUS_SUCCESS) {
170170
std::cerr << "Failed to map virtual memory" << std::endl;
171171
return false;
172172
}
@@ -175,14 +175,14 @@ bool testVirtualMem(infiniDevice_t device, int deviceId) {
175175
size_t num_elements = min_granularity / sizeof(size_t);
176176
std::vector<size_t> host_data(num_elements);
177177
std::iota(host_data.begin(), host_data.end(), 0);
178-
if (infinirtMemcpy(mapped_ptr1, host_data.data(), min_granularity, INFINIRT_MEMCPY_H2D) != INFINI_STATUS_SUCCESS) {
178+
if (infinirtMemcpy(vm1, host_data.data(), min_granularity, INFINIRT_MEMCPY_H2D) != INFINI_STATUS_SUCCESS) {
179179
std::cerr << "Failed to copy data to device" << std::endl;
180180
return false;
181181
}
182182

183183
// Read data through second mapping
184184
std::vector<size_t> host_data2(num_elements, 0);
185-
if (infinirtMemcpy(host_data2.data(), mapped_ptr2, min_granularity, INFINIRT_MEMCPY_D2H) != INFINI_STATUS_SUCCESS) {
185+
if (infinirtMemcpy(host_data2.data(), vm2, min_granularity, INFINIRT_MEMCPY_D2H) != INFINI_STATUS_SUCCESS) {
186186
std::cerr << "Failed to copy data from device" << std::endl;
187187
return false;
188188
}
@@ -200,7 +200,7 @@ bool testVirtualMem(infiniDevice_t device, int deviceId) {
200200
}
201201

202202
// Verify memory access fails after unmapping
203-
if (infinirtMemcpy(host_data.data(), mapped_ptr1, min_granularity, INFINIRT_MEMCPY_D2H) == INFINI_STATUS_SUCCESS) {
203+
if (infinirtMemcpy(host_data.data(), vm1, min_granularity, INFINIRT_MEMCPY_D2H) == INFINI_STATUS_SUCCESS) {
204204
std::cerr << "Memory access after unmap should fail" << std::endl;
205205
return false;
206206
}
@@ -215,24 +215,83 @@ bool testVirtualMem(infiniDevice_t device, int deviceId) {
215215
}
216216

217217
// Release physical memory
218-
if (infinirtReleasePhysicalMem(phy_mem) != INFINI_STATUS_SUCCESS) {
218+
if (infinirtReleasePhysicalMem(pm_handle) != INFINI_STATUS_SUCCESS) {
219219
std::cerr << "Failed to release physical memory" << std::endl;
220220
return false;
221221
}
222222

223223
// Release virtual memory regions
224-
if (infinirtReleaseVirtualMem(vm1) != INFINI_STATUS_SUCCESS) {
224+
if (infinirtReleaseVirtualMem(vm1, vm_len) != INFINI_STATUS_SUCCESS) {
225225
std::cerr << "Failed to release first virtual memory" << std::endl;
226226
return false;
227227
}
228-
if (infinirtReleaseVirtualMem(vm2) != INFINI_STATUS_SUCCESS) {
228+
if (infinirtReleaseVirtualMem(vm2, 2 * min_granularity) != INFINI_STATUS_SUCCESS) {
229229
std::cerr << "Failed to release second virtual memory" << std::endl;
230230
return false;
231231
}
232232

233233
std::cout << "All resources cleaned up successfully" << std::endl;
234234
}
235235

236+
// Test 4: Release virtual memory without unmapping
237+
{
238+
std::cout << "\nTest 4: Release virtual memory without unmapping" << std::endl;
239+
240+
// Create virtual memory
241+
void *vm;
242+
size_t vm_len = 2 * min_granularity;
243+
if (infinirtCreateVirtualMem(&vm, vm_len) != INFINI_STATUS_SUCCESS) {
244+
std::cerr << "Failed to create virtual memory" << std::endl;
245+
return false;
246+
}
247+
248+
// Create physical memory
249+
infinirtPhysicalMemoryHandle_t pm_handle;
250+
if (infinirtCreatePhysicalMem(&pm_handle, min_granularity) != INFINI_STATUS_SUCCESS) {
251+
std::cerr << "Failed to create physical memory" << std::endl;
252+
infinirtReleaseVirtualMem(vm, vm_len);
253+
return false;
254+
}
255+
256+
// Map virtual memory to physical memory
257+
if (infinirtMapVirtualMem(vm, min_granularity, 0, pm_handle) != INFINI_STATUS_SUCCESS) {
258+
std::cerr << "Failed to map virtual memory" << std::endl;
259+
infinirtReleasePhysicalMem(pm_handle);
260+
infinirtReleaseVirtualMem(vm, vm_len);
261+
return false;
262+
}
263+
264+
std::cout << "Attempting to release virtual memory without unmapping first..." << std::endl;
265+
// Try to release virtual memory without unmapping - this should fail
266+
if (infinirtReleaseVirtualMem(vm, vm_len) == INFINI_STATUS_SUCCESS) {
267+
std::cerr << "ERROR: Virtual memory release succeeded without unmapping first!" << std::endl;
268+
// Clean up anyway
269+
infinirtUnmapVirtualMem(vm, min_granularity);
270+
infinirtReleasePhysicalMem(pm_handle);
271+
return false;
272+
}
273+
std::cout << "As expected, virtual memory release failed when mapped" << std::endl;
274+
275+
// Clean up properly
276+
if (infinirtUnmapVirtualMem(vm, min_granularity) != INFINI_STATUS_SUCCESS) {
277+
std::cerr << "Failed to unmap virtual memory during cleanup" << std::endl;
278+
infinirtReleasePhysicalMem(pm_handle);
279+
return false;
280+
}
281+
282+
if (infinirtReleasePhysicalMem(pm_handle) != INFINI_STATUS_SUCCESS) {
283+
std::cerr << "Failed to release physical memory during cleanup" << std::endl;
284+
return false;
285+
}
286+
287+
// Now release should succeed
288+
if (infinirtReleaseVirtualMem(vm, vm_len) != INFINI_STATUS_SUCCESS) {
289+
std::cerr << "Failed to release virtual memory after unmapping" << std::endl;
290+
return false;
291+
}
292+
std::cout << "Successfully released virtual memory after proper unmapping" << std::endl;
293+
}
294+
236295
std::cout << "\nAll virtual memory tests PASSED!" << std::endl;
237296
return true;
238297
}

src/infinirt/cpu/infinirt_cpu.cc

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -92,27 +92,27 @@ infiniStatus_t getMemGranularityMinimum(size_t *granularity) {
9292
return INFINI_STATUS_NOT_IMPLEMENTED;
9393
}
9494

95-
infiniStatus_t createPhysicalMem(infinirtPhyMem_t *phy_mem, size_t len) {
95+
infiniStatus_t createPhysicalMem(infinirtPhysicalMemoryHandle_t *pm_handle, size_t len) {
9696
return INFINI_STATUS_NOT_IMPLEMENTED;
9797
}
9898

99-
infiniStatus_t releasePhysicalMem(infinirtPhyMem_t phy_mem) {
99+
infiniStatus_t releasePhysicalMem(infinirtPhysicalMemoryHandle_t pm_handle) {
100100
return INFINI_STATUS_NOT_IMPLEMENTED;
101101
}
102102

103-
infiniStatus_t createVirtualMem(infinirtVirtualMem_t *vm, size_t len) {
103+
infiniStatus_t createVirtualMem(void **vm, size_t len) {
104104
return INFINI_STATUS_NOT_IMPLEMENTED;
105105
}
106106

107-
infiniStatus_t releaseVirtualMem(infinirtVirtualMem_t vm) {
107+
infiniStatus_t releaseVirtualMem(void *vm, size_t len) {
108108
return INFINI_STATUS_NOT_IMPLEMENTED;
109109
}
110110

111-
infiniStatus_t mapVirtualMem(void **mapped_ptr, infinirtVirtualMem_t vm, size_t offset, infinirtPhyMem_t phy_mem) {
111+
infiniStatus_t mapVirtualMem(void *vm, size_t len, size_t offset, infinirtPhysicalMemoryHandle_t pm_handle) {
112112
return INFINI_STATUS_NOT_IMPLEMENTED;
113113
}
114114

115-
infiniStatus_t unmapVirtualMem(infinirtVirtualMem_t vm, size_t offset) {
115+
infiniStatus_t unmapVirtualMem(void *vm, size_t len) {
116116
return INFINI_STATUS_NOT_IMPLEMENTED;
117117
}
118118
} // namespace infinirt::cpu

0 commit comments

Comments
 (0)