Skip to content

Commit 7d51b62

Browse files
author
Hugh Delaney
committed
Don't assume ctx contains all devs in platform
A context might only contain a subset of the devices in a platform. Each ur_mem_handle_t_ contains some vectors of length ctx.NumDevices. Device->getIndex() will return the index of a device in a platform. Therefore, when we are using the ur_mem_handle_t vectors we must make sure the ctxIdx doesn't exceed ctx.NumDevices.
1 parent da3ee42 commit 7d51b62

File tree

2 files changed

+18
-12
lines changed

2 files changed

+18
-12
lines changed

source/adapters/hip/memory.cpp

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -459,7 +459,8 @@ ur_result_t allocateMemObjOnDeviceIfNeeded(ur_mem_handle_t Mem,
459459

460460
if (Mem->isBuffer()) {
461461
auto &Buffer = std::get<BufferMem>(Mem->Mem);
462-
hipDeviceptr_t &DevPtr = Buffer.Ptrs[hDevice->getIndex()];
462+
hipDeviceptr_t &DevPtr =
463+
Buffer.Ptrs[hDevice->getIndex() % Buffer.Ptrs.size()];
463464

464465
// Allocation has already been made
465466
if (DevPtr != BufferMem::native_type{0}) {
@@ -482,12 +483,12 @@ ur_result_t allocateMemObjOnDeviceIfNeeded(ur_mem_handle_t Mem,
482483
try {
483484
auto &Image = std::get<SurfaceMem>(Mem->Mem);
484485
// Allocation has already been made
485-
if (Image.Arrays[hDevice->getIndex()]) {
486+
if (Image.Arrays[hDevice->getIndex() % Image.Arrays.size()]) {
486487
return UR_RESULT_SUCCESS;
487488
}
488489
UR_CHECK_ERROR(hipArray3DCreate(
489490
reinterpret_cast<hipCUarray *>(&ImageArray), &Image.ArrayDesc));
490-
Image.Arrays[hDevice->getIndex()] = ImageArray;
491+
Image.Arrays[hDevice->getIndex() % Image.Arrays.size()] = ImageArray;
491492
// HIP_RESOURCE_DESC is a union of different structs, shown here
492493
// We need to fill it as described here to use it for a surface or texture
493494
// HIP_RESOURCE_DESC::resType must be HIP_RESOURCE_TYPE_ARRAY and
@@ -499,7 +500,7 @@ ur_result_t allocateMemObjOnDeviceIfNeeded(ur_mem_handle_t Mem,
499500
ImageResDesc.resType = hipResourceTypeArray;
500501

501502
UR_CHECK_ERROR(hipCreateSurfaceObject(&Surface, &ImageResDesc));
502-
Image.SurfObjs[hDevice->getIndex()] = Surface;
503+
Image.SurfObjs[hDevice->getIndex() % Image.SurfObjs.size()] = Surface;
503504
} catch (ur_result_t Err) {
504505
if (ImageArray) {
505506
UR_CHECK_ERROR(hipFreeArray(ImageArray));
@@ -610,9 +611,10 @@ ur_result_t migrateMemoryToDeviceIfNeeded(ur_mem_handle_t Mem,
610611
UR_ASSERT(hDevice, UR_RESULT_ERROR_INVALID_NULL_HANDLE);
611612
// Device allocation has already been initialized with most up to date
612613
// data in buffer
613-
if (Mem->HaveMigratedToDeviceSinceLastWrite[hDevice->getIndex()]) {
614+
if (Mem->HaveMigratedToDeviceSinceLastWrite
615+
[hDevice->getIndex() %
616+
Mem->HaveMigratedToDeviceSinceLastWrite.size()])
614617
return UR_RESULT_SUCCESS;
615-
}
616618

617619
ScopedContext Active(hDevice);
618620
if (Mem->isBuffer()) {
@@ -621,6 +623,8 @@ ur_result_t migrateMemoryToDeviceIfNeeded(ur_mem_handle_t Mem,
621623
UR_CHECK_ERROR(migrateImageToDevice(Mem, hDevice));
622624
}
623625

624-
Mem->HaveMigratedToDeviceSinceLastWrite[hDevice->getIndex()] = true;
626+
Mem->HaveMigratedToDeviceSinceLastWrite
627+
[hDevice->getIndex() % Mem->HaveMigratedToDeviceSinceLastWrite.size()] =
628+
true;
625629
return UR_RESULT_SUCCESS;
626630
}

source/adapters/hip/memory.hpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,8 @@ struct BufferMem {
102102
throw Err;
103103
}
104104
return reinterpret_cast<native_type>(
105-
reinterpret_cast<uint8_t *>(Ptrs[Device->getIndex()]) + Offset);
105+
reinterpret_cast<uint8_t *>(Ptrs[Device->getIndex() % Ptrs.size()]) +
106+
Offset);
106107
}
107108

108109
// This will allocate memory on device if there isn't already an active
@@ -266,7 +267,7 @@ struct SurfaceMem {
266267
Err != UR_RESULT_SUCCESS) {
267268
throw Err;
268269
}
269-
return Arrays[Device->getIndex()];
270+
return Arrays[Device->getIndex() % Arrays.size()];
270271
}
271272

272273
// Will allocate a new surface on device if not already allocated
@@ -276,7 +277,7 @@ struct SurfaceMem {
276277
Err != UR_RESULT_SUCCESS) {
277278
throw Err;
278279
}
279-
return SurfObjs[Device->getIndex()];
280+
return SurfObjs[Device->getIndex() % SurfObjs.size()];
280281
}
281282

282283
ur_mem_type_t getImageType() const noexcept { return ImageDesc.type; }
@@ -510,8 +511,9 @@ struct ur_mem_handle_t_ {
510511
urEventRetain(NewEvent);
511512
LastEventWritingToMemObj = NewEvent;
512513
for (const auto &Device : Context->getDevices()) {
513-
HaveMigratedToDeviceSinceLastWrite[Device->getIndex()] =
514-
Device == NewEvent->getQueue()->getDevice();
514+
HaveMigratedToDeviceSinceLastWrite
515+
[Device->getIndex() % HaveMigratedToDeviceSinceLastWrite.size()] =
516+
Device == NewEvent->getQueue()->getDevice();
515517
}
516518
}
517519
};

0 commit comments

Comments
 (0)