diff --git a/onnxruntime/core/providers/dml/DmlExecutionProvider/src/PooledUploadHeap.cpp b/onnxruntime/core/providers/dml/DmlExecutionProvider/src/PooledUploadHeap.cpp index 375ee87bd4..a4d284df43 100644 --- a/onnxruntime/core/providers/dml/DmlExecutionProvider/src/PooledUploadHeap.cpp +++ b/onnxruntime/core/providers/dml/DmlExecutionProvider/src/PooledUploadHeap.cpp @@ -125,8 +125,8 @@ namespace Dml // No chunks were able to accommodate the allocation - create a new chunk and return that instead - // At least double the capacity of the pool - const size_t newChunkSize = std::max({ m_totalCapacity, c_minChunkSize, sizeInBytes }); + // At least double the capacity of the pool, limit to c_maxChunkSize so DX12 does not reject size + const size_t newChunkSize = std::min(std::max({ m_totalCapacity, c_minChunkSize, sizeInBytes }), c_maxChunkSize); m_chunks.push_back(CreateChunk(m_device.Get(), newChunkSize)); m_totalCapacity += newChunkSize; diff --git a/onnxruntime/core/providers/dml/DmlExecutionProvider/src/PooledUploadHeap.h b/onnxruntime/core/providers/dml/DmlExecutionProvider/src/PooledUploadHeap.h index 1202ae9243..0315b08751 100644 --- a/onnxruntime/core/providers/dml/DmlExecutionProvider/src/PooledUploadHeap.h +++ b/onnxruntime/core/providers/dml/DmlExecutionProvider/src/PooledUploadHeap.h @@ -32,6 +32,7 @@ namespace Dml private: static constexpr size_t c_minChunkSize = 1024 * 1024; // 1MB static constexpr size_t c_allocationAlignment = 512; // In bytes; as per D3D12 requirement for buffers + static constexpr size_t c_maxChunkSize = 0xFFFF0000; // ~4 GiB limitation for DX12 CPU-visible resource // A suballoction from a chunk struct Allocation