mirror of
https://github.com/nomic-ai/kompute.git
synced 2026-05-12 01:19:58 +00:00
d59dc41ffcbac3bd2ba00eebebe1db13ffb15685
Vulkan Kompute
Principles
- Non-vulkan naming convention to disambiguate Vulkan vs Kompute components
- Extends the existing vulkan API with a simpler compute-specific interface
- BYOV: Play nice with existing Vulkan applications with a bring-your-own-Vulkan design
- TODO
Getting Started
Use default equations
int main() {
kp::Manager kManager(); // Chooses device 0
kp::Tensor inputOne = kp::Tensor({0, 1, 2, 3});
kp::Tensor inputTwo;
inputTwo = kManager.eval<kp::OpCreateTensor>(&inputTwo);
kp::Tensor output = kManager.eval<kp::OpMult>(inputOne, inputTwo);
std::cout << output << std::endl;
}
int main() {
kp::Manager kManager(); // Chooses device 0
kp::Tensor inputOne = kManager.eval<kp::OpCreateTensor>({0, 1, 2, 3}); // Mounts to device and binds to 0
kp::Tensor inputTwo = kManager.eval<kp::OpCreateTensor>({0, 1, 2, 3}); // Mounts to device and binds to 1
kp::Tensor inputOne({0, 1, 2, 3});
kManager.eval<kp::OpCreateTensor>(&inputOne); // Mounts to device and binds to 0
kp::Tensor inputOne({0, 1, 2, 3});
kManager.eval<kp::OpCreateTensor>(&inputTwo); // Mounts to device and binds to 0
kp::Tensor output = kManager.eval<kp::OpMult>(inputOne, inputTwo);
std::cout << output << std::endl;
}
Create your own operation
class CustomOp : kp::BaseOperator {
CusomOp() {
this->mAlgorithm = kp::Algorithm("path/to/your/shader.compute.spv")
}
kp::Tensor init(kp::Tensor* rhs, kp::Tensor* lhs, kp::Tensor* result) override {
this->appendParameter(kp::Parameter(rhs)); // Binding 0
this->appendParameter(kp::Parameter(lhs)); // Binding 1
this->appendParameter(kp::Parameter(result)); // Binding 2
}
}
int main() {
kp::Manager kManager(); // Chooses device 0
kp::Tensor inputOne({0, 1, 2, 3});
kp::Tensor inputTwo({0, 1, 2, 3});
kp::Tensor output;
kManager.eval<kp::CustomOp>(&inputOne, &inputTwo, &output);
std::cout << output << std::endl;
}
Use equations to group operations on memory and execution step
int main() {
kp::Manager kManager(); // Chooses device 0
kp::Sequence sq;
kManager.createSequence(&sq);
sq.begin();
kp::Tensor inputOne;
sq.record<kp::OpCreateTensor>(&inputOne, {0, 1, 2, 3}); // Mounts to device and binds to 0
kp::Tensor inputTwo;
sq.record<kp::OpCreateTensor>(&inputTwo, {0, 1, 2, 3}); // Mounts to device and binds to 1
kp::Tensor output;
sq.record<kp::OpMult>(&inputOne, &inputTwo, &output);
sq.end();
sq.eval();
std::cout << output << std::endl;
}
Development
Follows Mozilla C++ Style Guide https://www-archive.mozilla.org/hacking/mozilla-style-guide.html
Description
General purpose GPU compute framework built on Vulkan to support 1000s of cross vendor graphics cards (AMD, Qualcomm, NVIDIA & friends). Blazing fast, mobile-enabled, asynchronous and optimized for advanced GPU data processing usecases. Backed by the Linux Foundation.
Languages
C++
78.7%
CMake
9.7%
Python
6.7%
Makefile
1.9%
Shell
1.6%
Other
1.4%