try to do kernel decomp
This commit is contained in:
@@ -2,8 +2,7 @@
|
||||
|
||||
#include "host_timer.h"
|
||||
|
||||
A2Task1SolutionKernelDecomposition::A2Task1SolutionKernelDecomposition(AppResources &app, uint workGroupSize, std::string shaderFileName) :
|
||||
app(app), workGroupSize(workGroupSize), shaderFileName(shaderFileName) {}
|
||||
A2Task1SolutionKernelDecomposition::A2Task1SolutionKernelDecomposition(AppResources &app, uint workGroupSize, std::string shaderFileName) : app(app), workGroupSize(workGroupSize), shaderFileName(shaderFileName) {}
|
||||
|
||||
void A2Task1SolutionKernelDecomposition::prepare(const std::vector<uint> &input)
|
||||
{
|
||||
@@ -17,24 +16,22 @@ void A2Task1SolutionKernelDecomposition::prepare(const std::vector<uint> &input)
|
||||
pipelineLayout = app.device.createPipelineLayout(pipInfo);
|
||||
|
||||
// Specialization constant for workgroup size
|
||||
std::array<vk::SpecializationMapEntry, 1> specEntries = std::array<vk::SpecializationMapEntry, 1>{
|
||||
std::array<vk::SpecializationMapEntry, 1> specEntries = std::array<vk::SpecializationMapEntry, 1>{
|
||||
{{0U, 0U, sizeof(workGroupSize)}},
|
||||
};
|
||||
std::array<uint32_t, 1> specValues = {workGroupSize}; //for workgroup sizes
|
||||
vk::SpecializationInfo specInfo = vk::SpecializationInfo(CAST(specEntries), specEntries.data(),
|
||||
CAST(specValues) * sizeof(int), specValues.data());
|
||||
};
|
||||
std::array<uint32_t, 1> specValues = {workGroupSize}; // for workgroup sizes
|
||||
vk::SpecializationInfo specInfo = vk::SpecializationInfo(CAST(specEntries), specEntries.data(), CAST(specValues) * sizeof(int), specValues.data());
|
||||
|
||||
Cmn::createShader(app.device, shaderModule, shaderFileName);
|
||||
Cmn::createPipeline(app.device, pipeline, pipelineLayout, specInfo, shaderModule);
|
||||
|
||||
for (int i = 0; i < 2; i++) {
|
||||
createBuffer(app.pDevice, app.device, mpInput->size() * sizeof((*mpInput)[0]),
|
||||
vk::BufferUsageFlagBits::eTransferDst | vk::BufferUsageFlagBits::eTransferSrc | vk::BufferUsageFlagBits::eStorageBuffer,
|
||||
vk::MemoryPropertyFlagBits::eDeviceLocal, "buffer_" + std::to_string(i), buffers[i].buf, buffers[i].mem);
|
||||
for (int i = 0; i < 2; i++)
|
||||
{
|
||||
createBuffer(app.pDevice, app.device, mpInput->size() * sizeof((*mpInput)[0]), vk::BufferUsageFlagBits::eTransferDst | vk::BufferUsageFlagBits::eTransferSrc | vk::BufferUsageFlagBits::eStorageBuffer, vk::MemoryPropertyFlagBits::eDeviceLocal, "buffer_" + std::to_string(i), buffers[i].buf, buffers[i].mem);
|
||||
}
|
||||
|
||||
fillDeviceWithStagingBuffer(app.pDevice, app.device, app.transferCommandPool, app.transferQueue, buffers[0], input);
|
||||
|
||||
|
||||
Cmn::createDescriptorPool(app.device, bindings, descriptorPool, 2);
|
||||
for (int i = 0; i < 2; i++)
|
||||
Cmn::allocateDescriptorSet(app.device, descriptorSets[i], descriptorPool, descriptorSetLayout);
|
||||
@@ -48,7 +45,7 @@ void A2Task1SolutionKernelDecomposition::compute()
|
||||
{
|
||||
vk::CommandBufferAllocateInfo allocInfo(
|
||||
app.computeCommandPool, vk::CommandBufferLevel::ePrimary, 1U);
|
||||
vk::CommandBuffer cb = app.device.allocateCommandBuffers( allocInfo )[0];
|
||||
vk::CommandBuffer cb = app.device.allocateCommandBuffers(allocInfo)[0];
|
||||
|
||||
vk::CommandBufferBeginInfo beginInfo(vk::CommandBufferUsageFlagBits::eOneTimeSubmit);
|
||||
|
||||
@@ -60,6 +57,29 @@ void A2Task1SolutionKernelDecomposition::compute()
|
||||
// (A2Task1SolutionKernelDecomposition::result())
|
||||
// HINT: You can alternate between the two provided descriptor sets to implement ping-pong
|
||||
|
||||
uint blocksize = 512;
|
||||
uint kernelCount = mpInput->size() / blocksize;
|
||||
PushConstant p;
|
||||
|
||||
for (; kernelCount > 0; kernelCount /= 2)
|
||||
{
|
||||
activeBuffer = activeBuffer == 0 ? 1 : 0;
|
||||
cb.bindDescriptorSets(vk::PipelineBindPoint::eCompute, pipelineLayout, 0U, 1U, &descriptorSets[activeBuffer], 0U, nullptr);
|
||||
p.size = blocksize;
|
||||
|
||||
cb.pushConstants(pipelineLayout, vk::ShaderStageFlagBits::eCompute, 0, sizeof(PushConstant), &p);
|
||||
|
||||
// for loop to call each kernel
|
||||
for (int i = 0; i < kernelCount; i++)
|
||||
{
|
||||
cb.dispatch(i * blocksize, 0, 0);
|
||||
}
|
||||
|
||||
vk::MemoryBarrier memoryBarrier(vk::AccessFlagBits::eShaderWrite, vk::AccessFlagBits::eShaderRead);
|
||||
cb.pipelineBarrier(vk::PipelineStageFlagBits::eComputeShader, vk::PipelineStageFlagBits::eComputeShader, vk::DependencyFlags(), 1, &memoryBarrier, 0, nullptr, 0, nullptr);
|
||||
|
||||
std::cout << "deine mum \n" ;
|
||||
}
|
||||
cb.end();
|
||||
|
||||
vk::SubmitInfo submitInfo = vk::SubmitInfo(0, nullptr, nullptr, 1, &cb);
|
||||
@@ -94,4 +114,4 @@ void A2Task1SolutionKernelDecomposition::cleanup()
|
||||
|
||||
for (int i = 0; i < 2; i++)
|
||||
destroyBuffer(app.device, buffers[i]);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user