mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-19 06:24:51 +08:00
Pass device to Buffer::isReadWriteOnCpuPreffered
Related-To: NEO-4672 Change-Id: I857db6af225799f4d3451620d9dfb13f3a099add Signed-off-by: Mateusz Jablonski <mateusz.jablonski@intel.com>
This commit is contained in:
committed by
sys_ocldev
parent
a822503b41
commit
01596c40f5
@@ -603,7 +603,7 @@ bool CommandQueue::bufferCpuCopyAllowed(Buffer *buffer, cl_command_type commandT
|
||||
}
|
||||
|
||||
//check if it is beneficial to do transfer on CPU
|
||||
if (!buffer->isReadWriteOnCpuPreffered(ptr, size)) {
|
||||
if (!buffer->isReadWriteOnCpuPreffered(ptr, size, getDevice())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -564,7 +564,8 @@ bool Buffer::isReadWriteOnCpuAllowed(uint32_t rootDeviceIndex) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Buffer::isReadWriteOnCpuPreffered(void *ptr, size_t size) {
|
||||
bool Buffer::isReadWriteOnCpuPreffered(void *ptr, size_t size, const Device &device) {
|
||||
auto graphicsAllocation = multiGraphicsAllocation.getGraphicsAllocation(device.getRootDeviceIndex());
|
||||
if (MemoryPool::isSystemMemoryPool(graphicsAllocation->getMemoryPool())) {
|
||||
//if buffer is not zero copy and pointer is aligned it will be more beneficial to do the transfer on GPU
|
||||
if (!isMemObjZeroCopy() && (reinterpret_cast<uintptr_t>(ptr) & (MemoryConstants::cacheLineSize - 1)) == 0) {
|
||||
@@ -572,7 +573,7 @@ bool Buffer::isReadWriteOnCpuPreffered(void *ptr, size_t size) {
|
||||
}
|
||||
|
||||
//on low power devices larger transfers are better on the GPU
|
||||
if (context->getDevice(0)->getDeviceInfo().platformLP && size > maxBufferSizeForReadWriteOnCpu) {
|
||||
if (device.getSpecializedDevice<ClDevice>()->getDeviceInfo().platformLP && size > maxBufferSizeForReadWriteOnCpu) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
||||
@@ -149,7 +149,7 @@ class Buffer : public MemObj {
|
||||
void transferDataFromHostPtr(MemObjSizeArray ©Size, MemObjOffsetArray ©Offset) override;
|
||||
|
||||
bool isReadWriteOnCpuAllowed(uint32_t rootDeviceIndex);
|
||||
bool isReadWriteOnCpuPreffered(void *ptr, size_t size);
|
||||
bool isReadWriteOnCpuPreffered(void *ptr, size_t size, const Device &device);
|
||||
|
||||
uint32_t getMocsValue(bool disableL3Cache, bool isReadOnlyArgument) const;
|
||||
uint32_t getSurfaceSize(bool alignSizeForAuxTranslation) const;
|
||||
|
||||
@@ -30,11 +30,11 @@ HWTEST_F(ReadWriteBufferCpuCopyTest, givenRenderCompressedGmmWhenAskingForCpuOpe
|
||||
auto unalignedPtr = ptrOffset(alignedPtr, 1);
|
||||
EXPECT_EQ(1u, allocation->storageInfo.getNumBanks());
|
||||
EXPECT_TRUE(buffer->isReadWriteOnCpuAllowed(rootDeviceIndex));
|
||||
EXPECT_TRUE(buffer->isReadWriteOnCpuPreffered(unalignedPtr, 1));
|
||||
EXPECT_TRUE(buffer->isReadWriteOnCpuPreffered(unalignedPtr, 1, *pDevice));
|
||||
|
||||
gmm->isRenderCompressed = true;
|
||||
EXPECT_FALSE(buffer->isReadWriteOnCpuAllowed(rootDeviceIndex));
|
||||
EXPECT_TRUE(buffer->isReadWriteOnCpuPreffered(unalignedPtr, 1));
|
||||
EXPECT_TRUE(buffer->isReadWriteOnCpuPreffered(unalignedPtr, 1, *pDevice));
|
||||
|
||||
alignedFree(alignedPtr);
|
||||
}
|
||||
@@ -58,7 +58,7 @@ HWTEST_F(ReadWriteBufferCpuCopyTest, GivenUnalignedReadPtrWhenReadingBufferThenM
|
||||
bool aligned = (reinterpret_cast<uintptr_t>(unalignedReadPtr) & (MemoryConstants::cacheLineSize - 1)) == 0;
|
||||
EXPECT_TRUE(!aligned || buffer->isMemObjZeroCopy());
|
||||
ASSERT_TRUE(buffer->isReadWriteOnCpuAllowed(pCmdQ->getDevice().getRootDeviceIndex()));
|
||||
ASSERT_TRUE(buffer->isReadWriteOnCpuPreffered(unalignedReadPtr, size));
|
||||
ASSERT_TRUE(buffer->isReadWriteOnCpuPreffered(unalignedReadPtr, size, context->getDevice(0)->getDevice()));
|
||||
|
||||
retVal = EnqueueReadBufferHelper<>::enqueueReadBuffer(pCmdQ,
|
||||
buffer.get(),
|
||||
@@ -99,7 +99,7 @@ HWTEST_F(ReadWriteBufferCpuCopyTest, GivenUnalignedSrcPtrWhenWritingBufferThenMe
|
||||
bool aligned = (reinterpret_cast<uintptr_t>(unalignedWritePtr) & (MemoryConstants::cacheLineSize - 1)) == 0;
|
||||
EXPECT_TRUE(!aligned || buffer->isMemObjZeroCopy());
|
||||
ASSERT_TRUE(buffer->isReadWriteOnCpuAllowed(pCmdQ->getDevice().getRootDeviceIndex()));
|
||||
ASSERT_TRUE(buffer->isReadWriteOnCpuPreffered(unalignedWritePtr, size));
|
||||
ASSERT_TRUE(buffer->isReadWriteOnCpuPreffered(unalignedWritePtr, size, context->getDevice(0)->getDevice()));
|
||||
|
||||
retVal = EnqueueWriteBufferHelper<>::enqueueWriteBuffer(pCmdQ,
|
||||
buffer.get(),
|
||||
@@ -144,31 +144,31 @@ HWTEST_F(ReadWriteBufferCpuCopyTest, GivenSpecificMemoryStructuresWhenReadingWri
|
||||
EXPECT_TRUE(buffer->isMemObjZeroCopy());
|
||||
|
||||
// zeroCopy == true && aligned/unaligned hostPtr
|
||||
EXPECT_TRUE(buffer->isReadWriteOnCpuPreffered(alignedHostPtr, MemoryConstants::cacheLineSize + 1));
|
||||
EXPECT_TRUE(buffer->isReadWriteOnCpuPreffered(unalignedHostPtr, MemoryConstants::cacheLineSize));
|
||||
EXPECT_TRUE(buffer->isReadWriteOnCpuPreffered(alignedHostPtr, MemoryConstants::cacheLineSize + 1, mockDevice->getDevice()));
|
||||
EXPECT_TRUE(buffer->isReadWriteOnCpuPreffered(unalignedHostPtr, MemoryConstants::cacheLineSize, mockDevice->getDevice()));
|
||||
|
||||
buffer.reset(Buffer::create(context, CL_MEM_USE_HOST_PTR, size, unalignedBufferPtr, retVal));
|
||||
|
||||
EXPECT_EQ(retVal, CL_SUCCESS);
|
||||
|
||||
// zeroCopy == false && unaligned hostPtr
|
||||
EXPECT_TRUE(buffer->isReadWriteOnCpuPreffered(unalignedHostPtr, MemoryConstants::cacheLineSize));
|
||||
EXPECT_TRUE(buffer->isReadWriteOnCpuPreffered(unalignedHostPtr, MemoryConstants::cacheLineSize, mockDevice->getDevice()));
|
||||
|
||||
buffer.reset(Buffer::create(mockContext.get(), CL_MEM_USE_HOST_PTR, 1 * MB, smallBufferPtr, retVal));
|
||||
|
||||
// platform LP == true && size <= 10 MB
|
||||
mockDevice->deviceInfo.platformLP = true;
|
||||
EXPECT_TRUE(buffer->isReadWriteOnCpuPreffered(smallBufferPtr, 1 * MB));
|
||||
EXPECT_TRUE(buffer->isReadWriteOnCpuPreffered(smallBufferPtr, 1 * MB, mockDevice->getDevice()));
|
||||
|
||||
// platform LP == false && size <= 10 MB
|
||||
mockDevice->deviceInfo.platformLP = false;
|
||||
EXPECT_TRUE(buffer->isReadWriteOnCpuPreffered(smallBufferPtr, 1 * MB));
|
||||
EXPECT_TRUE(buffer->isReadWriteOnCpuPreffered(smallBufferPtr, 1 * MB, mockDevice->getDevice()));
|
||||
|
||||
buffer.reset(Buffer::create(mockContext.get(), CL_MEM_ALLOC_HOST_PTR, largeBufferSize, nullptr, retVal));
|
||||
|
||||
// platform LP == false && size > 10 MB
|
||||
mockDevice->deviceInfo.platformLP = false;
|
||||
EXPECT_TRUE(buffer->isReadWriteOnCpuPreffered(buffer->getCpuAddress(), largeBufferSize));
|
||||
EXPECT_TRUE(buffer->isReadWriteOnCpuPreffered(buffer->getCpuAddress(), largeBufferSize, mockDevice->getDevice()));
|
||||
|
||||
alignedFree(smallBufferPtr);
|
||||
alignedFree(alignedHostPtr);
|
||||
@@ -203,13 +203,13 @@ HWTEST_F(ReadWriteBufferCpuCopyTest, GivenSpecificMemoryStructuresWhenReadingWri
|
||||
EXPECT_EQ(retVal, CL_SUCCESS);
|
||||
|
||||
// zeroCopy == false && aligned hostPtr
|
||||
EXPECT_FALSE(buffer->isReadWriteOnCpuPreffered(alignedHostPtr, MemoryConstants::cacheLineSize + 1));
|
||||
EXPECT_FALSE(buffer->isReadWriteOnCpuPreffered(alignedHostPtr, MemoryConstants::cacheLineSize + 1, mockDevice->getDevice()));
|
||||
|
||||
buffer.reset(Buffer::create(mockContext.get(), CL_MEM_ALLOC_HOST_PTR, largeBufferSize, nullptr, retVal));
|
||||
|
||||
// platform LP == true && size > 10 MB
|
||||
mockDevice->deviceInfo.platformLP = true;
|
||||
EXPECT_FALSE(buffer->isReadWriteOnCpuPreffered(buffer->getCpuAddress(), largeBufferSize));
|
||||
EXPECT_FALSE(buffer->isReadWriteOnCpuPreffered(buffer->getCpuAddress(), largeBufferSize, mockDevice->getDevice()));
|
||||
|
||||
alignedFree(alignedHostPtr);
|
||||
alignedFree(alignedBufferPtr);
|
||||
@@ -255,11 +255,11 @@ TEST(ReadWriteBufferOnCpu, givenNoHostPtrAndAlignedSizeWhenMemoryAllocationIsInN
|
||||
ASSERT_NE(nullptr, buffer.get());
|
||||
|
||||
EXPECT_TRUE(buffer->isReadWriteOnCpuAllowed(device->getRootDeviceIndex()));
|
||||
EXPECT_TRUE(buffer->isReadWriteOnCpuPreffered(reinterpret_cast<void *>(0x1000), MemoryConstants::pageSize));
|
||||
EXPECT_TRUE(buffer->isReadWriteOnCpuPreffered(reinterpret_cast<void *>(0x1000), MemoryConstants::pageSize, device->getDevice()));
|
||||
reinterpret_cast<MemoryAllocation *>(buffer->getGraphicsAllocation(device->getRootDeviceIndex()))->overrideMemoryPool(MemoryPool::SystemCpuInaccessible);
|
||||
//read write on CPU is allowed, but not preffered. We can access this memory via Lock.
|
||||
EXPECT_TRUE(buffer->isReadWriteOnCpuAllowed(device->getRootDeviceIndex()));
|
||||
EXPECT_FALSE(buffer->isReadWriteOnCpuPreffered(reinterpret_cast<void *>(0x1000), MemoryConstants::pageSize));
|
||||
EXPECT_FALSE(buffer->isReadWriteOnCpuPreffered(reinterpret_cast<void *>(0x1000), MemoryConstants::pageSize, device->getDevice()));
|
||||
}
|
||||
|
||||
TEST(ReadWriteBufferOnCpu, givenPointerThatRequiresCpuCopyWhenCpuCopyIsEvaluatedThenTrueIsReturned) {
|
||||
@@ -313,5 +313,5 @@ TEST(ReadWriteBufferOnCpu, whenLocalMemoryPoolAllocationIsAskedForPreferenceThen
|
||||
reinterpret_cast<MemoryAllocation *>(buffer->getGraphicsAllocation(device->getRootDeviceIndex()))->overrideMemoryPool(MemoryPool::LocalMemory);
|
||||
|
||||
EXPECT_TRUE(buffer->isReadWriteOnCpuAllowed(device->getRootDeviceIndex()));
|
||||
EXPECT_FALSE(buffer->isReadWriteOnCpuPreffered(reinterpret_cast<void *>(0x1000), MemoryConstants::pageSize));
|
||||
EXPECT_FALSE(buffer->isReadWriteOnCpuPreffered(reinterpret_cast<void *>(0x1000), MemoryConstants::pageSize, device->getDevice()));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user