Updated to use shader statics

This commit is contained in:
Alejandro Saucedo 2021-02-20 17:06:54 +00:00
parent 9a19e3b280
commit 2fb0641de0
10 changed files with 85 additions and 131 deletions

View file

@ -1,6 +1,6 @@
#pragma once
#include "kompute/Core.hpp"
#include "kompute/ShaderUtil.hpp"
#include "kompute/Shader.hpp"
#include "kompute/shaders/shaderopmult.hpp"
#include "kompute/shaders/shaderlogisticregression.hpp"
#include "kompute/Manager.hpp"

View file

@ -116,90 +116,20 @@ extern py::object kp_debug, kp_info, kp_warning, kp_error;
namespace kp {
static std::vector<char> spirv_from_sources(const std::vector<std::string>& sources,
const std::vector<std::string>& files = {},
const std::string& entryPoint = "main",
std::vector<std::pair<std::string,std::string>> definitions = {}) {
class Shader {
public:
static std::vector<char> compile(
const std::vector<std::string>& sources,
const std::vector<std::string>& files = {},
const std::string& entryPoint = "main",
std::vector<std::pair<std::string,std::string>> definitions = {});
// Initialize glslang library.
glslang::InitializeProcess();
// Currently we don't support other shader types nor plan to
const EShLanguage language = EShLangCompute;
glslang::TShader shader(language);
std::vector<const char*> filesCStr(files.size()), sourcesCStr(sources.size());
for (size_t i = 0; i < sources.size(); i++) sourcesCStr[i] = sources[i].c_str();
if (files.size() > 1) {
assert(files.size() == sources.size());
for (size_t i = 0; i < files.size(); i++) filesCStr[i] = files[i].c_str();
shader.setStringsWithLengthsAndNames(sourcesCStr.data(), nullptr, filesCStr.data(), filesCStr.size());
}
else {
filesCStr = {""};
shader.setStringsWithLengthsAndNames(sourcesCStr.data(), nullptr, filesCStr.data(), sourcesCStr.size());
}
shader.setEntryPoint(entryPoint.c_str());
shader.setSourceEntryPoint(entryPoint.c_str());
std::string info_log = "";
const EShMessages messages = static_cast<EShMessages>(EShMsgDefault | EShMsgVulkanRules | EShMsgSpvRules);
if (!shader.parse(&glslang::DefaultTBuiltInResource, 100, false, messages))
{
info_log = std::string(shader.getInfoLog()) + "\n" + std::string(shader.getInfoDebugLog());
SPDLOG_ERROR(info_log);
throw std::runtime_error(info_log);
}
// Add shader to new program object.
glslang::TProgram program;
program.addShader(&shader);
// Link program.
if (!program.link(messages))
{
info_log = std::string(program.getInfoLog()) + "\n" + std::string(program.getInfoDebugLog());
SPDLOG_ERROR(info_log);
throw std::runtime_error(info_log);
}
// Save any info log that was generated.
if (shader.getInfoLog())
{
info_log += std::string(shader.getInfoLog()) + "\n" + std::string(shader.getInfoDebugLog()) + "\n";
SPDLOG_INFO(info_log);
}
glslang::TIntermediate *intermediate = program.getIntermediate(language);
// Translate to SPIRV.
if (!intermediate)
{
info_log += "Failed to get shared intermediate code.\n";
SPDLOG_ERROR(info_log);
throw std::runtime_error(info_log);
}
spv::SpvBuildLogger logger;
std::vector<std::uint32_t> spirv;
glslang::GlslangToSpv(*intermediate, spirv, &logger);
if (shader.getInfoLog())
{
info_log += logger.getAllMessages() + "\n";
SPDLOG_DEBUG(info_log);
}
// Shutdown glslang library.
glslang::FinalizeProcess();
return std::vector<char>((char*)spirv.data(), (char*)(spirv.data()+spirv.size()) );
}
static std::vector<char> spirv_from_source(const std::string& source) {
return spirv_from_sources({source});
}
static std::vector<char> compile(
const std::string& source,
const std::string& entryPoint = "main",
std::vector<std::pair<std::string,std::string>> definitions = {});
};
}
/*

View file

@ -1,20 +1,13 @@
#pragma once
#include <iostream>
#include <vector>
#include "Core.hpp"
#include <glslang/Public/ShaderLang.h>
#include <StandAlone/ResourceLimits.h>
#include <SPIRV/GlslangToSpv.h>
#include "kompute/Shader.hpp"
namespace kp {
static std::vector<char> spirv_from_sources(const std::vector<std::string>& sources,
const std::vector<std::string>& files = {},
const std::string& entryPoint = "main",
std::vector<std::pair<std::string,std::string>> definitions = {}) {
std::vector<char>
Shader::compile(const std::vector<std::string>& sources,
const std::vector<std::string>& files,
const std::string& entryPoint,
std::vector<std::pair<std::string,std::string>> definitions) {
// Initialize glslang library.
glslang::InitializeProcess();
@ -91,8 +84,11 @@ static std::vector<char> spirv_from_sources(const std::vector<std::string>& sour
return std::vector<char>((char*)spirv.data(), (char*)(spirv.data()+spirv.size()) );
}
static std::vector<char> spirv_from_source(const std::string& source) {
return spirv_from_sources({source});
std::vector<char>
Shader::compile(const std::string& source,
const std::string& entryPoint,
std::vector<std::pair<std::string,std::string>> definitions) {
return compile({source});
}
}

View file

@ -0,0 +1,28 @@
#pragma once
#include <iostream>
#include <vector>
#include "Core.hpp"
#include <glslang/Public/ShaderLang.h>
#include <StandAlone/ResourceLimits.h>
#include <SPIRV/GlslangToSpv.h>
namespace kp {
class Shader {
public:
static std::vector<char> compile(
const std::vector<std::string>& sources,
const std::vector<std::string>& files = {},
const std::string& entryPoint = "main",
std::vector<std::pair<std::string,std::string>> definitions = {});
static std::vector<char> compile(
const std::string& source,
const std::string& entryPoint = "main",
std::vector<std::pair<std::string,std::string>> definitions = {});
};
}

View file

@ -55,7 +55,7 @@ TEST(TestAsyncOperations, TestManagerParallelExecution)
for (uint32_t i = 0; i < numParallel; i++) {
mgr.evalOpDefault<kp::OpAlgoBase>(
{ inputsSyncB[i] }, kp::spirv_from_source(shader));
{ inputsSyncB[i] }, kp::Shader::compile(shader));
}
auto endSync = std::chrono::high_resolution_clock::now();
@ -89,7 +89,7 @@ TEST(TestAsyncOperations, TestManagerParallelExecution)
mgrAsync.evalOpAsync<kp::OpAlgoBase>(
{ inputsAsyncB[i] },
"async" + std::to_string(i),
kp::spirv_from_source(shader));
kp::Shader::compile(shader));
}
for (uint32_t i = 0; i < numParallel; i++) {
@ -152,10 +152,10 @@ TEST(TestAsyncOperations, TestManagerAsyncExecution)
mgr.rebuild({ tensorA, tensorB });
mgr.evalOpAsync<kp::OpAlgoBase>(
{ tensorA }, "asyncOne", kp::spirv_from_source(shader));
{ tensorA }, "asyncOne", kp::Shader::compile(shader));
mgr.evalOpAsync<kp::OpAlgoBase>(
{ tensorB }, "asyncTwo", kp::spirv_from_source(shader));
{ tensorB }, "asyncTwo", kp::Shader::compile(shader));
mgr.evalOpAwait("asyncOne");
mgr.evalOpAwait("asyncTwo");

View file

@ -28,7 +28,7 @@ TEST(TestDestroy, TestDestroyTensorSingle)
sq->begin();
sq->record<kp::OpAlgoBase>(
{ tensorA }, kp::spirv_from_source(shader));
{ tensorA }, kp::Shader::compile(shader));
sq->end();
sq->eval();
@ -71,7 +71,7 @@ TEST(TestDestroy, TestDestroyTensorVector)
sq->begin();
sq->record<kp::OpAlgoBase>(
{ tensorA, tensorB }, kp::spirv_from_source(shader));
{ tensorA, tensorB }, kp::Shader::compile(shader));
sq->end();
sq->eval();
@ -136,7 +136,7 @@ TEST(TestDestroy, TestDestroySequenceSingle)
sq->begin();
sq->record<kp::OpAlgoBase>(
{ tensorA }, kp::spirv_from_source(shader));
{ tensorA }, kp::Shader::compile(shader));
sq->end();
sq->eval();
@ -176,14 +176,14 @@ TEST(TestDestroy, TestDestroySequenceVector)
sq1 = mgr.sequence("One");
sq1->begin();
sq1->record<kp::OpAlgoBase>(
{ tensorA }, kp::spirv_from_source(shader));
{ tensorA }, kp::Shader::compile(shader));
sq1->end();
sq1->eval();
sq2 = mgr.sequence("Two");
sq2->begin();
sq2->record<kp::OpAlgoBase>(
{ tensorA }, kp::spirv_from_source(shader));
{ tensorA }, kp::Shader::compile(shader));
sq2->end();
sq2->eval();
@ -218,11 +218,11 @@ TEST(TestDestroy, TestDestroySequenceNameSingleInsideManager)
mgr.evalOp<kp::OpAlgoBase>(
{ tensorA }, "one",
kp::spirv_from_source(shader));
kp::Shader::compile(shader));
mgr.evalOp<kp::OpAlgoBase>(
{ tensorA }, "two",
kp::spirv_from_source(shader));
kp::Shader::compile(shader));
mgr.evalOpDefault<kp::OpTensorSyncLocal>({ tensorA });
@ -257,7 +257,7 @@ TEST(TestDestroy, TestDestroySequenceNameSingleOutsideManager)
sq1 = mgr.sequence("One");
sq1->begin();
sq1->record<kp::OpAlgoBase>(
{ tensorA }, kp::spirv_from_source(shader));
{ tensorA }, kp::Shader::compile(shader));
sq1->end();
sq1->eval();
@ -291,11 +291,11 @@ TEST(TestDestroy, TestDestroySequenceNameVectorInsideManager)
mgr.evalOp<kp::OpAlgoBase>(
{ tensorA }, "one",
kp::spirv_from_source(shader));
kp::Shader::compile(shader));
mgr.evalOp<kp::OpAlgoBase>(
{ tensorA }, "two",
kp::spirv_from_source(shader));
kp::Shader::compile(shader));
mgr.evalOpDefault<kp::OpTensorSyncLocal>({ tensorA });
@ -325,11 +325,11 @@ TEST(TestDestroy, TestDestroySequenceNameVectorOutsideManager)
mgr.evalOp<kp::OpAlgoBase>(
{ tensorA }, "one",
kp::spirv_from_source(shader));
kp::Shader::compile(shader));
mgr.evalOp<kp::OpAlgoBase>(
{ tensorA }, "two",
kp::spirv_from_source(shader));
kp::Shader::compile(shader));
mgr.evalOpDefault<kp::OpTensorSyncLocal>({ tensorA });
@ -359,7 +359,7 @@ TEST(TestDestroy, TestDestroySequenceNameDefaultOutsideManager)
mgr.evalOpDefault<kp::OpAlgoBase>(
{ tensorA },
kp::spirv_from_source(shader));
kp::Shader::compile(shader));
mgr.evalOpDefault<kp::OpTensorSyncLocal>({ tensorA });

View file

@ -28,11 +28,11 @@ TEST(TestMultipleAlgoExecutions, SingleSequenceRecord)
sq->begin();
sq->record<kp::OpAlgoBase>(
{ tensorA }, kp::spirv_from_source(shader));
{ tensorA }, kp::Shader::compile(shader));
sq->record<kp::OpAlgoBase>(
{ tensorA }, kp::spirv_from_source(shader));
{ tensorA }, kp::Shader::compile(shader));
sq->record<kp::OpAlgoBase>(
{ tensorA }, kp::spirv_from_source(shader));
{ tensorA }, kp::Shader::compile(shader));
sq->record<kp::OpTensorSyncLocal>({ tensorA });
@ -73,19 +73,19 @@ TEST(TestMultipleAlgoExecutions, MultipleCmdBufRecords)
// Then perform the computations
sq->begin();
sq->record<kp::OpAlgoBase>({ tensorA },
kp::spirv_from_source(shader));
kp::Shader::compile(shader));
sq->end();
sq->eval();
sq->begin();
sq->record<kp::OpAlgoBase>({ tensorA },
kp::spirv_from_source(shader));
kp::Shader::compile(shader));
sq->end();
sq->eval();
sq->begin();
sq->record<kp::OpAlgoBase>({ tensorA },
kp::spirv_from_source(shader));
kp::Shader::compile(shader));
sq->end();
sq->eval();
@ -122,7 +122,7 @@ TEST(TestMultipleAlgoExecutions, MultipleSequences)
sq->begin();
sq->record<kp::OpAlgoBase>(
{ tensorA }, kp::spirv_from_source(shader));
{ tensorA }, kp::Shader::compile(shader));
sq->end();
sq->eval();
@ -135,7 +135,7 @@ TEST(TestMultipleAlgoExecutions, MultipleSequences)
sq->begin();
sq->record<kp::OpAlgoBase>(
{ tensorA }, kp::spirv_from_source(shader));
{ tensorA }, kp::Shader::compile(shader));
sq->end();
sq->eval();
@ -148,7 +148,7 @@ TEST(TestMultipleAlgoExecutions, MultipleSequences)
sq->begin();
sq->record<kp::OpAlgoBase>(
{ tensorA }, kp::spirv_from_source(shader));
{ tensorA }, kp::Shader::compile(shader));
sq->end();
sq->eval();
@ -206,7 +206,7 @@ TEST(TestMultipleAlgoExecutions, SingleRecordMultipleEval)
sq->begin();
sq->record<kp::OpAlgoBase>(
{ tensorA }, kp::spirv_from_source(shader));
{ tensorA }, kp::Shader::compile(shader));
sq->end();
@ -265,7 +265,7 @@ TEST(TestMultipleAlgoExecutions, ManagerEvalMultSourceStrOpCreate)
mgr.evalOpDefault<kp::OpAlgoBase>(
{ tensorInA, tensorInB, tensorOut },
kp::spirv_from_source(shader));
kp::Shader::compile(shader));
mgr.evalOpDefault<kp::OpTensorSyncLocal>({ tensorOut });
@ -308,7 +308,7 @@ TEST(TestMultipleAlgoExecutions, ManagerEvalMultSourceStrMgrCreate)
mgr.evalOpDefault<kp::OpAlgoBase>(
{ tensorInA, tensorInB, tensorOut },
kp::spirv_from_source(shader));
kp::Shader::compile(shader));
mgr.evalOpDefault<kp::OpTensorSyncLocal>({ tensorOut });
@ -340,7 +340,7 @@ TEST(TestMultipleAlgoExecutions, SequenceAlgoDestroyOutsideManagerScope)
sq->begin();
sq->record<kp::OpAlgoBase>(
{ tensorA }, kp::spirv_from_source(shader));
{ tensorA }, kp::Shader::compile(shader));
sq->end();
sq->eval();

View file

@ -53,7 +53,7 @@ TEST(TestProcessingIterations, IterateThroughMultipleSumAndCopies)
sq->record<kp::OpAlgoBase>(
{ tensorA, tensorB },
kp::spirv_from_source(shader));
kp::Shader::compile(shader));
sq->record<kp::OpTensorCopy>({ tensorB, tensorA });
sq->end();

View file

@ -29,7 +29,7 @@ TEST(TestOpAlgoBase, ShaderRawDataFromConstructor)
)");
mgr.evalOpDefault<kp::OpAlgoBase>(
{ tensorA, tensorB }, kp::spirv_from_source(shader));
{ tensorA, tensorB }, kp::Shader::compile(shader));
mgr.evalOpDefault<kp::OpTensorSyncLocal>({ tensorA, tensorB });

View file

@ -35,7 +35,7 @@ TEST(TestSpecializationConstants, TestTwoConstants)
sq->begin();
sq->record<kp::OpAlgoBase>(
{ tensorA, tensorB },
kp::spirv_from_source(shader),
kp::Shader::compile(shader),
kp::Workgroup(), spec);
sq->end();