Skip to content

Commit

Permalink
Updated formatting
Browse files Browse the repository at this point in the history
Signed-off-by: Alejandro Saucedo <axsauze@gmail.com>
  • Loading branch information
axsaucedo committed Nov 16, 2021
1 parent 5308141 commit 797ba87
Show file tree
Hide file tree
Showing 12 changed files with 161 additions and 112 deletions.
19 changes: 12 additions & 7 deletions src/Algorithm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ Algorithm::isInit()
void
Algorithm::destroy()
{
// We don't have to free memory on destroy as it's freed by the commandBuffer destructor
// if (this->mPushConstantsData) {
// We don't have to free memory on destroy as it's freed by the
// commandBuffer destructor if (this->mPushConstantsData) {
// free(this->mPushConstantsData);
// }
// if (this->mSpecializationConstantsData) {
Expand Down Expand Up @@ -238,7 +238,8 @@ Algorithm::createPipeline()
if (this->mPushConstantsSize) {
pushConstantRange.setStageFlags(vk::ShaderStageFlagBits::eCompute);
pushConstantRange.setOffset(0);
pushConstantRange.setSize(this->mPushConstantsDataTypeMemorySize * this->mPushConstantsSize);
pushConstantRange.setSize(this->mPushConstantsDataTypeMemorySize *
this->mPushConstantsSize);

pipelineLayoutInfo.setPushConstantRangeCount(1);
pipelineLayoutInfo.setPPushConstantRanges(&pushConstantRange);
Expand All @@ -254,7 +255,8 @@ Algorithm::createPipeline()
for (uint32_t i = 0; i < this->mSpecializationConstantsSize; i++) {
vk::SpecializationMapEntry specializationEntry(
static_cast<uint32_t>(i),
static_cast<uint32_t>(this->mSpecializationConstantsDataTypeMemorySize * i),
static_cast<uint32_t>(
this->mSpecializationConstantsDataTypeMemorySize * i),
this->mSpecializationConstantsDataTypeMemorySize);

specializationEntries.push_back(specializationEntry);
Expand All @@ -265,7 +267,8 @@ Algorithm::createPipeline()
vk::SpecializationInfo specializationInfo(
static_cast<uint32_t>(specializationEntries.size()),
specializationEntries.data(),
this->mSpecializationConstantsDataTypeMemorySize * this->mSpecializationConstantsSize,
this->mSpecializationConstantsDataTypeMemorySize *
this->mSpecializationConstantsSize,
this->mSpecializationConstantsData);

vk::PipelineShaderStageCreateInfo shaderStage(
Expand Down Expand Up @@ -339,12 +342,14 @@ Algorithm::recordBindPush(const vk::CommandBuffer& commandBuffer)
{
if (this->mPushConstantsSize) {
KP_LOG_DEBUG("Kompute Algorithm binding push constants memory size: {}",
this->mPushConstantsSize * this->mPushConstantsDataTypeMemorySize);
this->mPushConstantsSize *
this->mPushConstantsDataTypeMemorySize);

commandBuffer.pushConstants(*this->mPipelineLayout,
vk::ShaderStageFlagBits::eCompute,
0,
this->mPushConstantsSize * this->mPushConstantsDataTypeMemorySize,
this->mPushConstantsSize *
this->mPushConstantsDataTypeMemorySize,
this->mPushConstantsData);
}
}
Expand Down
8 changes: 4 additions & 4 deletions src/Manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -288,22 +288,22 @@ Manager::createDevice(const std::vector<uint32_t>& familyQueueIndices,
}

this->mFreeDevice = true;

// Getting an integer that says how many vuklan devices we have
uint32_t deviceCount = 0;
this->mInstance->enumeratePhysicalDevices(&deviceCount, nullptr);

// This means there are no devices at all
if (deviceCount == 0) {
throw std::runtime_error("Failed to find GPUs with Vulkan support! "
"Maybe you haven't installed vulkan drivers?");
}

// This means that we're exceeding our device limit, for
// example if we have 2 devices, just physicalDeviceIndex
// 0 and 1 are acceptable. Hence, physicalDeviceIndex should
// always be less than deviceCount, else we raise an error
if ( !(deviceCount > physicalDeviceIndex) ) {
if (!(deviceCount > physicalDeviceIndex)) {
throw std::runtime_error("There is no such physical index or device, "
"please use your existing device");
}
Expand Down
6 changes: 3 additions & 3 deletions src/OpAlgoDispatch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,9 @@ OpAlgoDispatch::record(const vk::CommandBuffer& commandBuffer)

if (this->mPushConstantsSize) {
this->mAlgorithm->setPushConstants(
this->mPushConstantsData,
this->mPushConstantsSize,
this->mPushConstantsDataTypeMemorySize);
this->mPushConstantsData,
this->mPushConstantsSize,
this->mPushConstantsDataTypeMemorySize);
}

this->mAlgorithm->recordBindCore(commandBuffer);
Expand Down
87 changes: 51 additions & 36 deletions src/include/kompute/Algorithm.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,13 @@ class Algorithm
* @param spirv (optional) The spirv code to use to create the algorithm
* @param workgroup (optional) The kp::Workgroup to use for the dispatch
* which defaults to kp::Workgroup(tensor[0].size(), 1, 1) if not set.
* @param specializationConstants (optional) The templatable param is to be used to
* initialize the specialization constants which cannot be changed once set.
* @param pushConstants (optional) This templatable param is to be used when
* initializing the pipeline, which set the size of the push constants -
* these can be modified but all new values must have the same data type and length
* as otherwise it will result in errors.
* @param specializationConstants (optional) The templatable param is to be
* used to initialize the specialization constants which cannot be changed
* once set.
* @param pushConstants (optional) This templatable param is to be used
* when initializing the pipeline, which set the size of the push constants
* - these can be modified but all new values must have the same data type
* and length as otherwise it will result in errors.
*/
template<typename S = float, typename P = float>
Algorithm(std::shared_ptr<vk::Device> device,
Expand All @@ -44,15 +45,20 @@ class Algorithm
this->mDevice = device;

if (tensors.size() && spirv.size()) {
KP_LOG_INFO("Kompute Algorithm initialising with tensor size: {} and "
"spirv size: {}",
tensors.size(),
spirv.size());
this->rebuild(
tensors, spirv, workgroup, specializationConstants, pushConstants);
KP_LOG_INFO(
"Kompute Algorithm initialising with tensor size: {} and "
"spirv size: {}",
tensors.size(),
spirv.size());
this->rebuild(tensors,
spirv,
workgroup,
specializationConstants,
pushConstants);
} else {
KP_LOG_INFO("Kompute Algorithm constructor with empty tensors and or "
"spirv so not rebuilding vulkan components");
KP_LOG_INFO(
"Kompute Algorithm constructor with empty tensors and or "
"spirv so not rebuilding vulkan components");
}
}

Expand All @@ -64,8 +70,9 @@ class Algorithm
* @param spirv The spirv code to use to create the algorithm
* @param workgroup (optional) The kp::Workgroup to use for the dispatch
* which defaults to kp::Workgroup(tensor[0].size(), 1, 1) if not set.
* @param specializationConstants (optional) The std::vector<float> to use to
* initialize the specialization constants which cannot be changed once set.
* @param specializationConstants (optional) The std::vector<float> to use
* to initialize the specialization constants which cannot be changed once
* set.
* @param pushConstants (optional) The std::vector<float> to use when
* initializing the pipeline, which set the size of the push constants -
* these can be modified but all new values must have the same vector size
Expand All @@ -87,11 +94,14 @@ class Algorithm
if (this->mSpecializationConstantsData) {
free(this->mSpecializationConstantsData);
}
uint32_t memorySize = sizeof(decltype(specializationConstants.back()));
uint32_t memorySize =
sizeof(decltype(specializationConstants.back()));
uint32_t size = specializationConstants.size();
uint32_t totalSize = size * memorySize;
this->mSpecializationConstantsData = malloc(totalSize);
memcpy(this->mSpecializationConstantsData, specializationConstants.data(), totalSize);
memcpy(this->mSpecializationConstantsData,
specializationConstants.data(),
totalSize);
this->mSpecializationConstantsDataTypeMemorySize = memorySize;
this->mSpecializationConstantsSize = size;
}
Expand All @@ -109,11 +119,11 @@ class Algorithm
this->mPushConstantsSize = size;
}

this->setWorkgroup(workgroup,
this->mTensors.size() ? this->mTensors[0]->size() : 1);
this->setWorkgroup(
workgroup, this->mTensors.size() ? this->mTensors[0]->size() : 1);

// Descriptor pool is created first so if available then destroy all before
// rebuild
// Descriptor pool is created first so if available then destroy all
// before rebuild
if (this->isInit()) {
this->destroy();
}
Expand Down Expand Up @@ -176,9 +186,9 @@ class Algorithm
* Sets the push constants to the new value provided to use in the next
* bindPush()
*
* @param pushConstants The templatable vector is to be used to set the push constants to use in the
* next bindPush(...) calls. The constants provided must be of the same size
* as the ones created during initialization.
* @param pushConstants The templatable vector is to be used to set the push
* constants to use in the next bindPush(...) calls. The constants provided
* must be of the same size as the ones created during initialization.
*/
template<typename T>
void setPushConstants(const std::vector<T>& pushConstants)
Expand All @@ -193,21 +203,24 @@ class Algorithm
* Sets the push constants to the new value provided to use in the next
* bindPush() with the raw memory block location and memory size to be used.
*
* @param data The raw data point to copy the data from, without modifying the pointer.
* @param data The raw data point to copy the data from, without modifying
* the pointer.
* @param size The number of data elements provided in the data
* @param memorySize The memory size of each of the data elements in bytes.
*/
void setPushConstants(void* data, uint32_t size, uint32_t memorySize) {
void setPushConstants(void* data, uint32_t size, uint32_t memorySize)
{

uint32_t totalSize = memorySize * size;
uint32_t previousTotalSize = this->mPushConstantsDataTypeMemorySize * this->mPushConstantsSize;
uint32_t previousTotalSize =
this->mPushConstantsDataTypeMemorySize * this->mPushConstantsSize;

if (totalSize != previousTotalSize) {
throw std::runtime_error(
fmt::format("Kompute Algorithm push "
"constant total memory size provided is {} but expected {} bytes",
totalSize,
previousTotalSize));
throw std::runtime_error(fmt::format(
"Kompute Algorithm push "
"constant total memory size provided is {} but expected {} bytes",
totalSize,
previousTotalSize));
}
if (this->mPushConstantsData) {
free(this->mPushConstantsData);
Expand All @@ -230,13 +243,15 @@ class Algorithm
/**
* Gets the specialization constants of the current algorithm.
*
* @returns The std::vector<float> currently set for specialization constants
* @returns The std::vector<float> currently set for specialization
* constants
*/
template<typename T>
const std::vector<T> getSpecializationConstants()
{
return { (T*)this->mSpecializationConstantsData,
((T*)this->mSpecializationConstantsData) + this->mSpecializationConstantsSize };
((T*)this->mSpecializationConstantsData) +
this->mSpecializationConstantsSize };
}
/**
* Gets the specialization constants of the current algorithm.
Expand All @@ -247,7 +262,7 @@ class Algorithm
const std::vector<T> getPushConstants()
{
return { (T*)this->mPushConstantsData,
((T*)this->mPushConstantsData) + this->mPushConstantsSize };
((T*)this->mPushConstantsData) + this->mPushConstantsSize };
}
/**
* Gets the current tensors that are used in the algorithm.
Expand Down
20 changes: 11 additions & 9 deletions src/include/kompute/Manager.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -124,8 +124,9 @@ class Manager
}

/**
* Default non-template function that can be used to create algorithm objects
* which provides default types to the push and spec constants as floats.
* Default non-template function that can be used to create algorithm
* objects which provides default types to the push and spec constants as
* floats.
*
* @param tensors (optional) The tensors to initialise the algorithm with
* @param spirv (optional) The SPIRV bytes for the algorithm to dispatch
Expand All @@ -144,7 +145,8 @@ class Manager
const std::vector<float>& specializationConstants = {},
const std::vector<float>& pushConstants = {})
{
return this->algorithm<>(tensors, spirv, workgroup, specializationConstants, pushConstants);
return this->algorithm<>(
tensors, spirv, workgroup, specializationConstants, pushConstants);
}

/**
Expand All @@ -155,10 +157,10 @@ class Manager
* @param spirv (optional) The SPIRV bytes for the algorithm to dispatch
* @param workgroup (optional) kp::Workgroup for algorithm to use, and
* defaults to (tensor[0].size(), 1, 1)
* @param specializationConstants (optional) templatable vector parameter to use for
* specialization constants, and defaults to an empty constant
* @param pushConstants (optional) templatable vector parameter to use for push constants,
* and defaults to an empty constant
* @param specializationConstants (optional) templatable vector parameter to
* use for specialization constants, and defaults to an empty constant
* @param pushConstants (optional) templatable vector parameter to use for
* push constants, and defaults to an empty constant
* @returns Shared pointer with initialised algorithm
*/
template<typename S = float, typename P = float>
Expand Down Expand Up @@ -200,7 +202,8 @@ class Manager
/**
* Information about the current device.
*
* @return vk::PhysicalDeviceProperties containing information about the device
* @return vk::PhysicalDeviceProperties containing information about the
*device
**/
vk::PhysicalDeviceProperties getDeviceProperties() const;

Expand All @@ -211,7 +214,6 @@ class Manager
**/
std::vector<vk::PhysicalDevice> listDevices() const;


private:
// -------------- OPTIONALLY OWNED RESOURCES
std::shared_ptr<vk::Instance> mInstance = nullptr;
Expand Down
15 changes: 10 additions & 5 deletions test/TestAsyncOperations.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -168,8 +168,10 @@ TEST(TestAsyncOperations, TestManagerAsyncExecution)

// AMD Drivers in Windows may see an error in this line due to timeout.
// In order to fix this, it requires a change on Windows registries.
// More details on this can be found here: https://docs.substance3d.com/spdoc/gpu-drivers-crash-with-long-computations-128745489.html
// Context on solution discussed in github: https://github.com/KomputeProject/kompute/issues/196#issuecomment-808866505
// More details on this can be found here:
// https://docs.substance3d.com/spdoc/gpu-drivers-crash-with-long-computations-128745489.html
// Context on solution discussed in github:
// https://github.com/KomputeProject/kompute/issues/196#issuecomment-808866505
sq1->evalAsync<kp::OpAlgoDispatch>(algo1);
sq2->evalAsync<kp::OpAlgoDispatch>(algo2);

Expand Down Expand Up @@ -232,8 +234,10 @@ TEST(TestAsyncOperations, TestManagerAsyncExecutionTimeout)

// AMD Drivers in Windows may see an error in this line due to timeout.
// In order to fix this, it requires a change on Windows registries.
// More details on this can be found here: https://docs.substance3d.com/spdoc/gpu-drivers-crash-with-long-computations-128745489.html
// Context on solution discussed in github: https://github.com/KomputeProject/kompute/issues/196#issuecomment-808866505
// More details on this can be found here:
// https://docs.substance3d.com/spdoc/gpu-drivers-crash-with-long-computations-128745489.html
// Context on solution discussed in github:
// https://github.com/KomputeProject/kompute/issues/196#issuecomment-808866505
sq1->evalAsync<kp::OpAlgoDispatch>(algo1);
sq2->evalAsync<kp::OpAlgoDispatch>(algo2);

Expand All @@ -245,7 +249,8 @@ TEST(TestAsyncOperations, TestManagerAsyncExecutionTimeout)
std::chrono::duration_cast<std::chrono::microseconds>(endSync - startSync)
.count();

// The time should several orders of magnitude smaller (in this 100k instead of 1m ns)
// The time should several orders of magnitude smaller (in this 100k instead
// of 1m ns)
EXPECT_LT(duration, 100000);

sq1->evalAsync<kp::OpTensorSyncLocal>({ tensorA, tensorB });
Expand Down
4 changes: 2 additions & 2 deletions test/TestLogisticRegression.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -126,8 +126,8 @@ TEST(TestLogisticRegression, TestMainLogisticRegressionManualCopy)
kp::shader_data::
shaders_glsl_logisticregression_comp_spv_len));

std::shared_ptr<kp::Algorithm> algorithm =
mgr.algorithm(params, spirv, kp::Workgroup(), std::vector<float>({ 5.0 }));
std::shared_ptr<kp::Algorithm> algorithm = mgr.algorithm(
params, spirv, kp::Workgroup(), std::vector<float>({ 5.0 }));

std::shared_ptr<kp::Sequence> sq =
mgr.sequence()
Expand Down
3 changes: 2 additions & 1 deletion test/TestManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,8 @@ TEST(TestManager, TestClearDestroy)
{
std::shared_ptr<kp::TensorT<float>> tensorLHS = mgr.tensor({ 0, 1, 2 });
std::shared_ptr<kp::TensorT<float>> tensorRHS = mgr.tensor({ 2, 4, 6 });
std::shared_ptr<kp::TensorT<float>> tensorOutput = mgr.tensor({ 0, 0, 0 });
std::shared_ptr<kp::TensorT<float>> tensorOutput =
mgr.tensor({ 0, 0, 0 });

std::vector<std::shared_ptr<kp::Tensor>> params = { tensorLHS,
tensorRHS,
Expand Down
Loading

0 comments on commit 797ba87

Please sign in to comment.