performance: add staging transfers for cl buffers

Related-To: NEO-13529

Signed-off-by: Szymon Morek <szymon.morek@intel.com>
This commit is contained in:
Szymon Morek
2025-01-14 10:44:54 +00:00
committed by Compute-Runtime-Automation
parent 4270e3c356
commit 0b4fe9a0df
10 changed files with 299 additions and 17 deletions

View File

@@ -163,6 +163,33 @@ StagingTransferStatus StagingBufferManager::performImageTransfer(const void *ptr
return result;
}
StagingTransferStatus StagingBufferManager::performBufferTransfer(const void *ptr, size_t globalOffset, size_t globalSize, ChunkTransferBufferFunc &chunkTransferBufferFunc, CommandStreamReceiver *csr, bool isRead) {
StagingQueue stagingQueue;
auto copiesNum = globalSize / chunkSize;
auto remainder = globalSize % chunkSize;
auto chunkOffset = globalOffset;
StagingTransferStatus result{};
for (auto i = 0u; i < copiesNum; i++) {
auto chunkPtr = ptrOffset(ptr, i * chunkSize);
result = performChunkTransfer(isRead, const_cast<void *>(chunkPtr), chunkSize, stagingQueue, csr, chunkTransferBufferFunc, chunkOffset, chunkSize);
if (result.chunkCopyStatus != 0) {
return result;
}
chunkOffset += chunkSize;
}
if (remainder != 0) {
auto chunkPtr = ptrOffset(ptr, copiesNum * chunkSize);
result = performChunkTransfer(isRead, const_cast<void *>(chunkPtr), remainder, stagingQueue, csr, chunkTransferBufferFunc, chunkOffset, remainder);
if (result.chunkCopyStatus != 0) {
return result;
}
}
result.waitStatus = drainAndReleaseStagingQueue(stagingQueue);
return result;
}
/*
* This method is used for read transfers. It waits for oldest transfer to finish
* and copies data associated with that transfer to host allocation.

View File

@@ -25,7 +25,7 @@ class HeapAllocator;
using ChunkCopyFunction = std::function<int32_t(void *, void *, size_t)>;
using ChunkTransferImageFunc = std::function<int32_t(void *, const size_t *, const size_t *)>;
using ChunkTransferBufferFunc = std::function<int32_t(void *, size_t, size_t)>;
class StagingBuffer {
public:
StagingBuffer(void *baseAddress, size_t size);
@@ -83,6 +83,7 @@ class StagingBufferManager {
StagingTransferStatus performCopy(void *dstPtr, const void *srcPtr, size_t size, ChunkCopyFunction &chunkCopyFunc, CommandStreamReceiver *csr);
StagingTransferStatus performImageTransfer(const void *ptr, const size_t *globalOrigin, const size_t *globalRegion, size_t rowPitch, ChunkTransferImageFunc &chunkTransferImageFunc, CommandStreamReceiver *csr, bool isRead);
StagingTransferStatus performBufferTransfer(const void *ptr, size_t globalOffset, size_t globalSize, ChunkTransferBufferFunc &chunkTransferBufferFunc, CommandStreamReceiver *csr, bool isRead);
std::pair<HeapAllocator *, uint64_t> requestStagingBuffer(size_t &size);
void trackChunk(const StagingBufferTracker &tracker);