kfdtest: add KFDSVMRangeTest MigrateAccessInPlaceTest

To test ACCESS_IN_PLACE GPU mapping update to system memory.

Change-Id: I5b990215f39692e829128d848125e1ae0d571e03
Signed-off-by: Philip Yang <Philip.Yang@amd.com>


[ROCm/ROCR-Runtime commit: 351a41ac76]
Этот коммит содержится в:
Philip Yang
2021-06-08 12:12:42 -04:00
родитель 221f75ea7a
Коммит 2401e9aafd
+58
Просмотреть файл
@@ -657,6 +657,64 @@ TEST_F(KFDSVMRangeTest, MigrateTest) {
TEST_END
}
/*
* Test if GPU mapping to system memory is correct after range on VRAM split and migrate back
* to system memory.
*
* Steps, it is same for XNACK on or off
* 1. alloc 256MB range on system memory, set ACCESS_IN_PLACE by GPU
* 2. Prefetcg to migrate range to GPU VRAM
* 3. Use CPU to fill the range, range is migrated back to system memory, and split by granularity,
* GPU mapping update to system memory
* 4. Use GPU sdma to fill the range in system memory
* 5. Check if data is correct in system memory
*/
TEST_F(KFDSVMRangeTest, MigrateAccessInPlaceTest) {
TEST_REQUIRE_ENV_CAPABILITIES(ENVCAPS_64BITLINUX);
TEST_START(TESTPROFILE_RUNALL);
if (!SVMAPISupported())
return;
int defaultGPUNode = m_NodeInfo.HsaDefaultGPUNode();
ASSERT_GE(defaultGPUNode, 0) << "failed to get default GPU Node";
if (m_FamilyId < FAMILY_AI) {
LOG() << std::hex << "Skipping test: No svm range support for family ID 0x" << m_FamilyId << "." << std::endl;
return;
}
if (!GetVramSize(defaultGPUNode)) {
LOG() << "Skipping test: No VRAM found." << std::endl;
return;
}
unsigned int BufferSize = 256 << 20;
SDMAQueue sdmaQueue;
ASSERT_SUCCESS(sdmaQueue.Create(defaultGPUNode));
HsaSVMRange DataBuffer(BufferSize, defaultGPUNode);
HSAuint32 *pData = DataBuffer.As<HSAuint32 *>();
EXPECT_SUCCESS(SVMRangeMapInPlaceToNode(pData, BufferSize, defaultGPUNode));
EXPECT_SUCCESS(SVMRangePrefetchToNode(pData, BufferSize, defaultGPUNode));
for (HSAuint32 i = 0; i < BufferSize / 4; i += 1024)
pData[i] = i;
/* GPU/SDMA update content in buffer migrated back to system memory */
sdmaQueue.PlaceAndSubmitPacket(SDMAFillDataPacket(sdmaQueue.GetFamilyId(),
pData, 0x55AAAA55, BufferSize));
sdmaQueue.Wait4PacketConsumption();
for (HSAuint32 i = 0; i < BufferSize / 4; i += 1024)
ASSERT_EQ(0x55AAAA55, pData[i]);
ASSERT_SUCCESS(sdmaQueue.Destroy());
TEST_END
}
/*
* The test changes migration granularity, then trigger CPU page fault to migrate
* the svm range from vram to ram.