performance: introduce staging read for cl_buffer

Related-To: NEO-14026

Signed-off-by: Szymon Morek <szymon.morek@intel.com>
This commit is contained in:
Szymon Morek
2025-03-10 19:29:45 +00:00
committed by Compute-Runtime-Automation
parent b2b3b55b19
commit dacbce7f01
12 changed files with 272 additions and 29 deletions

View File

@@ -171,10 +171,7 @@ StagingTransferStatus StagingBufferManager::performImageTransfer(const void *ptr
}
}
if (isRead) {
auto numOfSubmittedTransfers = numOfChunks + (remainder != 0 ? 1 : 0);
result.waitStatus = drainAndReleaseStagingQueue(stagingQueue, std::min(numOfSubmittedTransfers, maxInFlightReads));
}
result.waitStatus = drainAndReleaseStagingQueue(isRead, stagingQueue, numOfChunks + (remainder != 0 ? 1 : 0));
return result;
}
@@ -203,6 +200,7 @@ StagingTransferStatus StagingBufferManager::performBufferTransfer(const void *pt
}
}
result.waitStatus = drainAndReleaseStagingQueue(isRead, stagingQueue, copiesNum + (remainder != 0 ? 1 : 0));
return result;
}
@@ -236,14 +234,16 @@ WaitStatus StagingBufferManager::copyStagingToHost(const std::pair<UserData, Sta
* Waits for all pending transfers to finish.
* Releases staging buffers back to pool for reuse.
*/
WaitStatus StagingBufferManager::drainAndReleaseStagingQueue(const StagingQueue &stagingQueue, size_t numOfTransfers) const {
StagingBufferTracker tracker{};
for (auto i = 0u; i < numOfTransfers; i++) {
auto status = copyStagingToHost(stagingQueue[i], tracker);
if (status == WaitStatus::gpuHang) {
return status;
WaitStatus StagingBufferManager::drainAndReleaseStagingQueue(bool isRead, const StagingQueue &stagingQueue, size_t numOfSubmittedTransfers) const {
if (isRead) {
StagingBufferTracker tracker{};
for (auto i = 0u; i < std::min(numOfSubmittedTransfers, maxInFlightReads); i++) {
auto status = copyStagingToHost(stagingQueue[i], tracker);
if (status == WaitStatus::gpuHang) {
return status;
}
tracker.freeChunk();
}
tracker.freeChunk();
}
return WaitStatus::ready;
}

View File

@@ -106,7 +106,7 @@ class StagingBufferManager : NEO::NonCopyableAndNonMovableClass {
StagingTransferStatus performChunkTransfer(size_t chunkTransferId, bool isRead, const UserData &userData, StagingQueue &currentStagingBuffers, CommandStreamReceiver *csr, Func &func, Args... args);
WaitStatus copyStagingToHost(const std::pair<UserData, StagingBufferTracker> &transfer, StagingBufferTracker &tracker) const;
WaitStatus drainAndReleaseStagingQueue(const StagingQueue &stagingQueue, size_t numOfTransfers) const;
WaitStatus drainAndReleaseStagingQueue(bool isRead, const StagingQueue &stagingQueue, size_t numOfSubmittedTransfers) const;
bool isValidForStaging(const Device &device, const void *ptr, size_t size, bool hasDependencies);