mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-05 09:09:04 +08:00
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:
committed by
Compute-Runtime-Automation
parent
b2b3b55b19
commit
dacbce7f01
@@ -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;
|
||||
}
|
||||
|
||||
@@ -106,7 +106,7 @@ class StagingBufferManager : NEO::NonCopyableAndNonMovableClass {
|
||||
StagingTransferStatus performChunkTransfer(size_t chunkTransferId, bool isRead, const UserData &userData, StagingQueue ¤tStagingBuffers, 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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user