Reformatted
This commit is contained in:
parent
8aa7843f0e
commit
0d18dc50e6
13 changed files with 166 additions and 95 deletions
116
src/Tensor.cpp
116
src/Tensor.cpp
|
|
@ -3,7 +3,8 @@
|
|||
|
||||
namespace kp {
|
||||
|
||||
Tensor::Tensor() {
|
||||
Tensor::Tensor()
|
||||
{
|
||||
SPDLOG_DEBUG("Kompute Tensor base constructor");
|
||||
this->mTensorType = TensorTypes::eDevice;
|
||||
}
|
||||
|
|
@ -13,11 +14,11 @@ Tensor::Tensor(std::vector<uint32_t> data, TensorTypes tensorType)
|
|||
SPDLOG_DEBUG("Kompute Tensor constructor shape and type");
|
||||
|
||||
this->mData = data;
|
||||
this->mShape = {data.size()};
|
||||
this->mShape = { data.size() };
|
||||
this->mTensorType = tensorType;
|
||||
}
|
||||
|
||||
Tensor::~Tensor()
|
||||
Tensor::~Tensor()
|
||||
{
|
||||
SPDLOG_DEBUG("Kompute Tensor destructor started");
|
||||
|
||||
|
|
@ -29,7 +30,8 @@ Tensor::~Tensor()
|
|||
|
||||
if (this->mFreeBuffer) {
|
||||
if (!this->mBuffer) {
|
||||
spdlog::error("Kompose Tensor expected to free buffer but got null buffer");
|
||||
spdlog::error(
|
||||
"Kompose Tensor expected to free buffer but got null buffer");
|
||||
} else {
|
||||
SPDLOG_DEBUG("Kompose Tensor destroying buffer");
|
||||
this->mDevice->destroy(*this->mBuffer);
|
||||
|
|
@ -38,7 +40,8 @@ Tensor::~Tensor()
|
|||
|
||||
if (this->mFreeMemory) {
|
||||
if (!this->mMemory) {
|
||||
spdlog::error("Kompose Tensor expected to free buffer but got null memory");
|
||||
spdlog::error(
|
||||
"Kompose Tensor expected to free buffer but got null memory");
|
||||
} else {
|
||||
SPDLOG_DEBUG("Kompose Tensor freeing memory");
|
||||
this->mDevice->freeMemory(*this->mMemory);
|
||||
|
|
@ -48,8 +51,14 @@ Tensor::~Tensor()
|
|||
SPDLOG_DEBUG("Kompute Tensor destructor success");
|
||||
}
|
||||
|
||||
void Tensor::init(std::shared_ptr<vk::PhysicalDevice> physicalDevice, std::shared_ptr<vk::Device> device, std::shared_ptr<vk::CommandBuffer> commandBuffer, std::vector<uint32_t> data) {
|
||||
SPDLOG_DEBUG("Kompute Tensor running init with physicalDevice and logical device");
|
||||
void
|
||||
Tensor::init(std::shared_ptr<vk::PhysicalDevice> physicalDevice,
|
||||
std::shared_ptr<vk::Device> device,
|
||||
std::shared_ptr<vk::CommandBuffer> commandBuffer,
|
||||
std::vector<uint32_t> data)
|
||||
{
|
||||
SPDLOG_DEBUG(
|
||||
"Kompute Tensor running init with physicalDevice and logical device");
|
||||
|
||||
this->mPhysicalDevice = physicalDevice;
|
||||
this->mDevice = device;
|
||||
|
|
@ -60,36 +69,50 @@ void Tensor::init(std::shared_ptr<vk::PhysicalDevice> physicalDevice, std::share
|
|||
this->createBuffer(data.data());
|
||||
}
|
||||
|
||||
std::vector<uint32_t> Tensor::data() {
|
||||
std::vector<uint32_t>
|
||||
Tensor::data()
|
||||
{
|
||||
return this->mData;
|
||||
}
|
||||
|
||||
uint64_t Tensor::memorySize() {
|
||||
uint64_t
|
||||
Tensor::memorySize()
|
||||
{
|
||||
return this->size() * sizeof(uint32_t);
|
||||
}
|
||||
|
||||
uint32_t Tensor::size() {
|
||||
uint32_t
|
||||
Tensor::size()
|
||||
{
|
||||
return this->mShape[0];
|
||||
}
|
||||
|
||||
std::array<uint32_t, KP_MAX_DIM_SIZE> Tensor::shape() {
|
||||
std::array<uint32_t, KP_MAX_DIM_SIZE>
|
||||
Tensor::shape()
|
||||
{
|
||||
return this->mShape;
|
||||
}
|
||||
|
||||
|
||||
Tensor::TensorTypes Tensor::tensorType() {
|
||||
Tensor::TensorTypes
|
||||
Tensor::tensorType()
|
||||
{
|
||||
return this->mTensorType;
|
||||
}
|
||||
|
||||
bool Tensor::isInit() {
|
||||
bool
|
||||
Tensor::isInit()
|
||||
{
|
||||
return this->mIsInit;
|
||||
}
|
||||
|
||||
void Tensor::recordCopyFrom(std::shared_ptr<Tensor> copyFromTensor) {
|
||||
void
|
||||
Tensor::recordCopyFrom(std::shared_ptr<Tensor> copyFromTensor)
|
||||
{
|
||||
SPDLOG_DEBUG("Kompute Tensor recordCopyFrom called");
|
||||
|
||||
if (!this->mIsInit) {
|
||||
throw std::runtime_error("Kompute Tensor attempted to run createBuffer without init");
|
||||
throw std::runtime_error(
|
||||
"Kompute Tensor attempted to run createBuffer without init");
|
||||
}
|
||||
|
||||
// TODO: Allow for dst and src offsets to be configured
|
||||
|
|
@ -100,21 +123,24 @@ void Tensor::recordCopyFrom(std::shared_ptr<Tensor> copyFromTensor) {
|
|||
SPDLOG_DEBUG("Kompute Tensor copying data size {}.", bufferSize);
|
||||
|
||||
// TODO: Ensure command buffer is in same device from buffer
|
||||
this->mCommandBuffer->copyBuffer(*copyFromTensor->mBuffer, *this->mBuffer, copyRegion);
|
||||
this->mCommandBuffer->copyBuffer(
|
||||
*copyFromTensor->mBuffer, *this->mBuffer, copyRegion);
|
||||
|
||||
this->mData = copyFromTensor->mData;
|
||||
}
|
||||
|
||||
vk::BufferUsageFlags Tensor::getBufferUsageFlags() {
|
||||
vk::BufferUsageFlags
|
||||
Tensor::getBufferUsageFlags()
|
||||
{
|
||||
switch (this->mTensorType) {
|
||||
case TensorTypes::eDevice:
|
||||
return vk::BufferUsageFlagBits::eStorageBuffer |
|
||||
vk::BufferUsageFlagBits::eTransferSrc |
|
||||
vk::BufferUsageFlagBits::eTransferDst;
|
||||
vk::BufferUsageFlagBits::eTransferSrc |
|
||||
vk::BufferUsageFlagBits::eTransferDst;
|
||||
break;
|
||||
case TensorTypes::eStaging:
|
||||
return vk::BufferUsageFlagBits::eTransferSrc|
|
||||
vk::BufferUsageFlagBits::eTransferDst;
|
||||
return vk::BufferUsageFlagBits::eTransferSrc |
|
||||
vk::BufferUsageFlagBits::eTransferDst;
|
||||
break;
|
||||
case TensorTypes::eStorage:
|
||||
return vk::BufferUsageFlagBits::eStorageBuffer;
|
||||
|
|
@ -124,7 +150,9 @@ vk::BufferUsageFlags Tensor::getBufferUsageFlags() {
|
|||
}
|
||||
}
|
||||
|
||||
vk::MemoryPropertyFlags Tensor::getMemoryPropertyFlags() {
|
||||
vk::MemoryPropertyFlags
|
||||
Tensor::getMemoryPropertyFlags()
|
||||
{
|
||||
switch (this->mTensorType) {
|
||||
case TensorTypes::eDevice:
|
||||
return vk::MemoryPropertyFlagBits::eDeviceLocal;
|
||||
|
|
@ -146,7 +174,8 @@ Tensor::createBuffer(void* data)
|
|||
SPDLOG_DEBUG("Kompute Tensor creating buffer");
|
||||
|
||||
if (!this->mIsInit) {
|
||||
throw std::runtime_error("Kompute Tensor attempted to run createBuffer without init");
|
||||
throw std::runtime_error(
|
||||
"Kompute Tensor attempted to run createBuffer without init");
|
||||
}
|
||||
|
||||
if (!this->mPhysicalDevice) {
|
||||
|
|
@ -161,43 +190,59 @@ Tensor::createBuffer(void* data)
|
|||
vk::BufferUsageFlags usageFlags = this->getBufferUsageFlags();
|
||||
vk::DeviceSize bufferSize = this->memorySize();
|
||||
|
||||
SPDLOG_DEBUG("Kompute Tensor creating buffer with memory size: {}, and usage flags: {}", bufferSize, vk::to_string(usageFlags));
|
||||
SPDLOG_DEBUG("Kompute Tensor creating buffer with memory size: {}, and "
|
||||
"usage flags: {}",
|
||||
bufferSize,
|
||||
vk::to_string(usageFlags));
|
||||
|
||||
vk::BufferCreateInfo bufferInfo(vk::BufferCreateFlags(), bufferSize, usageFlags, vk::SharingMode::eExclusive);
|
||||
vk::BufferCreateInfo bufferInfo(vk::BufferCreateFlags(),
|
||||
bufferSize,
|
||||
usageFlags,
|
||||
vk::SharingMode::eExclusive);
|
||||
|
||||
this->mBuffer = std::make_shared<vk::Buffer>();
|
||||
this->mDevice->createBuffer(&bufferInfo, nullptr, this->mBuffer.get());
|
||||
|
||||
SPDLOG_DEBUG("Kompute Tensor buffer created now creating memory");
|
||||
|
||||
vk::PhysicalDeviceMemoryProperties memoryProperties = this->mPhysicalDevice->getMemoryProperties();
|
||||
vk::PhysicalDeviceMemoryProperties memoryProperties =
|
||||
this->mPhysicalDevice->getMemoryProperties();
|
||||
|
||||
vk::MemoryRequirements memoryRequirements = this->mDevice->getBufferMemoryRequirements(*this->mBuffer);
|
||||
vk::MemoryRequirements memoryRequirements =
|
||||
this->mDevice->getBufferMemoryRequirements(*this->mBuffer);
|
||||
|
||||
vk::MemoryPropertyFlags memoryPropertyFlags =
|
||||
this->getMemoryPropertyFlags();
|
||||
this->getMemoryPropertyFlags();
|
||||
|
||||
uint32_t memoryTypeIndex = -1;
|
||||
for (uint32_t i = 0; i < memoryProperties.memoryTypeCount; i++) {
|
||||
if (memoryRequirements.memoryTypeBits & (1 << i)) {
|
||||
if ((memoryProperties.memoryTypes[i].propertyFlags & memoryPropertyFlags) == memoryPropertyFlags) {
|
||||
if ((memoryProperties.memoryTypes[i].propertyFlags &
|
||||
memoryPropertyFlags) == memoryPropertyFlags) {
|
||||
memoryTypeIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (memoryTypeIndex < 0) {
|
||||
throw std::runtime_error("Memory type index for buffer creation not found");
|
||||
throw std::runtime_error(
|
||||
"Memory type index for buffer creation not found");
|
||||
}
|
||||
|
||||
this->mFreeMemory = true;
|
||||
|
||||
SPDLOG_DEBUG("Kompute Tensor allocating memory index: {}, size {}, flags: {}", memoryTypeIndex, memoryRequirements.size, vk::to_string(memoryPropertyFlags));
|
||||
SPDLOG_DEBUG(
|
||||
"Kompute Tensor allocating memory index: {}, size {}, flags: {}",
|
||||
memoryTypeIndex,
|
||||
memoryRequirements.size,
|
||||
vk::to_string(memoryPropertyFlags));
|
||||
|
||||
vk::MemoryAllocateInfo memoryAllocateInfo(memoryRequirements.size, memoryTypeIndex);
|
||||
vk::MemoryAllocateInfo memoryAllocateInfo(memoryRequirements.size,
|
||||
memoryTypeIndex);
|
||||
|
||||
this->mMemory = std::make_shared<vk::DeviceMemory>();
|
||||
this->mDevice->allocateMemory(&memoryAllocateInfo, nullptr, this->mMemory.get());
|
||||
this->mDevice->allocateMemory(
|
||||
&memoryAllocateInfo, nullptr, this->mMemory.get());
|
||||
|
||||
this->mDevice->bindBufferMemory(*this->mBuffer, *this->mMemory, 0);
|
||||
|
||||
|
|
@ -207,7 +252,8 @@ Tensor::createBuffer(void* data)
|
|||
SPDLOG_DEBUG("Kompute Tensor mapping data to buffer");
|
||||
|
||||
// TODO: Verify if flushed memory ranges should happend in sequence
|
||||
void* mapped = this->mDevice->mapMemory(*this->mMemory, 0, bufferSize, vk::MemoryMapFlags());
|
||||
void* mapped = this->mDevice->mapMemory(
|
||||
*this->mMemory, 0, bufferSize, vk::MemoryMapFlags());
|
||||
memcpy(mapped, data, bufferSize);
|
||||
vk::MappedMemoryRange mappedRange(*this->mMemory, 0, bufferSize);
|
||||
this->mDevice->flushMappedMemoryRanges(1, &mappedRange);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue