mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-08 22:12:59 +08:00
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:
committed by
Compute-Runtime-Automation
parent
4270e3c356
commit
0b4fe9a0df
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user