P4 to Git Change 1545895 by gandryey@gera-w8 on 2018/04/24 18:25:56
SWDEV-79445 - OCL generic changes and code clean-up
- Replace dynamic memory object allocation for the managed buffer with a preallocated object
Affected files ...
... //depot/stg/opencl/drivers/opencl/runtime/device/device.hpp#298 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palconstbuf.cpp#9 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palconstbuf.hpp#8 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palmemory.hpp#5 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palresource.cpp#64 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palresource.hpp#21 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palvirtual.cpp#94 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palvirtual.hpp#50 edit
[ROCm/clr commit: 2f41f41977]
This commit is contained in:
@@ -838,15 +838,14 @@ class Memory : public amd::HeapObject {
|
||||
//! Decrement map count
|
||||
virtual void decIndMapCount() {}
|
||||
|
||||
size_t size_; //!< Memory size
|
||||
|
||||
private:
|
||||
//! Disable default copy constructor
|
||||
Memory& operator=(const Memory&);
|
||||
Memory& operator=(const Memory&) = delete;
|
||||
|
||||
//! Disable operator=
|
||||
Memory(const Memory&);
|
||||
|
||||
//! Our size
|
||||
size_t size_;
|
||||
Memory(const Memory&) = delete;
|
||||
};
|
||||
|
||||
class Sampler : public amd::HeapObject {
|
||||
|
||||
@@ -135,39 +135,28 @@ uint64_t ConstantBuffer::UploadDataToHw(const void* sysmem, uint32_t size) const
|
||||
}
|
||||
|
||||
// ================================================================================================
|
||||
XferBuffer::XferBuffer(ManagedBuffer& mbuf, uint32_t size)
|
||||
: mbuf_(mbuf)
|
||||
, size_(size)
|
||||
{}
|
||||
XferBuffer::XferBuffer(const Device& device, ManagedBuffer& mbuf, uint32_t size)
|
||||
: buffer_view_(device, size)
|
||||
, mbuf_(mbuf)
|
||||
, size_(size) {
|
||||
// Create a view for access
|
||||
Resource::ViewParams params = {};
|
||||
params.gpu_ = &mbuf_.gpu();
|
||||
params.offset_ = 0;
|
||||
params.size_ = size_;
|
||||
params.resource_ = mbuf_.activeMemory();
|
||||
bool result = buffer_view_.create(Resource::View, ¶ms);
|
||||
assert(result && "View creaiton should never return an error!");
|
||||
}
|
||||
|
||||
// ================================================================================================
|
||||
Memory& XferBuffer::Acquire(uint32_t size) const
|
||||
{
|
||||
Memory& XferBuffer::Acquire(uint32_t size) {
|
||||
uint64_t vm_address;
|
||||
// Reserve space in the managed buffer
|
||||
address cpu_address = mbuf_.reserve(size, &vm_address);
|
||||
// Create a view for access
|
||||
Memory* mem = new Memory(mbuf_.gpu().dev(), static_cast<size_t>(size));
|
||||
Resource::ViewParams params = {};
|
||||
params.gpu_ = &mbuf_.gpu();
|
||||
params.offset_ = vm_address - mbuf_.vmAddress();
|
||||
params.size_ = size;
|
||||
params.resource_ = mbuf_.activeMemory();
|
||||
if (nullptr == mem || !mem->create(Resource::View, ¶ms)) {
|
||||
delete mem;
|
||||
// If the suballocaiton failed for some reason, then return the top of the active buffer
|
||||
return mbuf_.reserveAtTheTop(size);
|
||||
}
|
||||
return *mem;
|
||||
}
|
||||
|
||||
// ================================================================================================
|
||||
void XferBuffer::Release(Memory& mem) const
|
||||
{
|
||||
// Delete view
|
||||
if (mem.desc().type_ == Resource::View) {
|
||||
delete &mem;
|
||||
}
|
||||
// Update a view for access
|
||||
buffer_view_.updateView(mbuf_.activeMemory(), vm_address - mbuf_.vmAddress(), size);
|
||||
return buffer_view_;
|
||||
}
|
||||
|
||||
} // namespace pal
|
||||
|
||||
@@ -116,8 +116,9 @@ private:
|
||||
class XferBuffer : public amd::EmbeddedObject {
|
||||
public:
|
||||
//! Constructor for the ConstBuffer class
|
||||
XferBuffer(ManagedBuffer& mbuf, //!< Managed buffer
|
||||
uint32_t size //!< Maximum size of the transfer buffer
|
||||
XferBuffer(const Device& device, //!< Active GPU device
|
||||
ManagedBuffer& mbuf, //!< Managed buffer
|
||||
uint32_t size //!< Maximum size of the transfer buffer
|
||||
);
|
||||
|
||||
//! Destructor for the ConstBuffer class
|
||||
@@ -128,11 +129,11 @@ public:
|
||||
* \return GPU memory object associated with free memory
|
||||
*/
|
||||
Memory& Acquire(uint32_t size //!< data size for transfers
|
||||
) const;
|
||||
);
|
||||
|
||||
//! Releases memory object used in the staging transfer
|
||||
void Release(Memory& mem //!< Memory object for release
|
||||
) const;
|
||||
) { buffer_view_.updateView(nullptr, 0, 0); }
|
||||
|
||||
size_t MaxSize() const { return static_cast<size_t>(size_); }
|
||||
|
||||
@@ -143,6 +144,7 @@ private:
|
||||
//! Disable operator=
|
||||
XferBuffer& operator=(const XferBuffer&) = delete;
|
||||
|
||||
Memory buffer_view_; //!< Buffer view returned in the acquire
|
||||
ManagedBuffer& mbuf_; //!< Managed buffer on GPU
|
||||
uint32_t size_; //!< Mx staging buffer size
|
||||
};
|
||||
|
||||
@@ -142,6 +142,12 @@ class Memory : public device::Memory, public Resource {
|
||||
(CL_MEM_ALLOC_HOST_PTR | CL_MEM_HOST_WRITE_ONLY | CL_MEM_READ_ONLY)));
|
||||
}
|
||||
|
||||
//! Quick view update for managed buffers. It should avoid expensive object allocations
|
||||
void updateView(Resource* view, size_t offset, size_t size) {
|
||||
size_ = size;
|
||||
Resource::updateView(view, offset, size);
|
||||
}
|
||||
|
||||
protected:
|
||||
//! Decrement map count
|
||||
void decIndMapCount();
|
||||
|
||||
@@ -321,6 +321,8 @@ Resource::~Resource() {
|
||||
image_->Destroy();
|
||||
delete[] reinterpret_cast<char*>(image_);
|
||||
}
|
||||
|
||||
// Remove the current resource from the global resource list
|
||||
gpuDevice_.removeResource(this);
|
||||
}
|
||||
|
||||
@@ -1225,6 +1227,8 @@ void Resource::free()
|
||||
if (!desc().buffer_) {
|
||||
dev().srds().freeSrdSlot(hwSrd_);
|
||||
}
|
||||
|
||||
memRef_ = nullptr;
|
||||
}
|
||||
|
||||
// ================================================================================================
|
||||
|
||||
@@ -359,6 +359,28 @@ class Resource : public amd::HeapObject {
|
||||
//! Erase an entry in the array for provided queue index
|
||||
void eraseGpuEvents(uint index) { events_.erase(events_.begin() + index); }
|
||||
|
||||
//! Quick view update for managed buffers. It should avoid expensive object allocations
|
||||
//! If the base resource is null, then the view is released
|
||||
void updateView(Resource* base, size_t offset, size_t size) {
|
||||
if (base == nullptr) {
|
||||
desc_.type_ = Empty;
|
||||
memRef_->release();
|
||||
memRef_ = nullptr;
|
||||
viewOwner_ = nullptr;
|
||||
} else {
|
||||
desc_.type_ = View;
|
||||
viewOwner_ = base;
|
||||
offset_ = offset + viewOwner_->offset();
|
||||
assert(viewOwner_->data() != nullptr && "CPU access must be provide for this call!");
|
||||
address_ = viewOwner_->data() + offset;
|
||||
desc_.cardMemory_ = viewOwner_->desc().cardMemory_;
|
||||
memRef_ = viewOwner_->memRef_;
|
||||
memRef_->retain();
|
||||
desc_.width_ = amd::alignUp(size, Pal::Formats::BytesPerPixel(Pal::ChNumFormat::X32_Uint)) /
|
||||
Pal::Formats::BytesPerPixel(Pal::ChNumFormat::X32_Uint);
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
/*! \brief Creates a PAL iamge object, associated with the resource
|
||||
*
|
||||
|
||||
@@ -688,7 +688,7 @@ VirtualGPU::VirtualGPU(Device& device)
|
||||
tsCache_(nullptr),
|
||||
dmaFlushMgmt_(device),
|
||||
managedBuffer_(*this, device.settings().stagedXferSize_ + 32 * Ki),
|
||||
writeBuffer_(managedBuffer_, device.settings().stagedXferSize_),
|
||||
writeBuffer_(device, managedBuffer_, device.settings().stagedXferSize_),
|
||||
hwRing_(0),
|
||||
readjustTimeGPU_(0),
|
||||
lastTS_(nullptr),
|
||||
|
||||
@@ -376,7 +376,7 @@ class VirtualGPU : public device::VirtualDevice {
|
||||
);
|
||||
|
||||
//! Return xfer buffer for staging operations
|
||||
const XferBuffer& xferWrite() const { return writeBuffer_; }
|
||||
XferBuffer& xferWrite() { return writeBuffer_; }
|
||||
|
||||
//! Adds a pinned memory object into a map
|
||||
void addPinnedMem(amd::Memory* mem);
|
||||
|
||||
Reference in New Issue
Block a user