nngn
compute Directory Reference

Compute back ends.

More...

Directory dependency graph for compute:
src/compute

Files

file  compute.cpp
 
file  compute.h [code]
 
file  lua_compute.cpp
 
file  opencl.cpp
 
file  opencl.h [code]
 
file  pseudo.cpp
 

Detailed Description

Compute back ends.

Compute back ends for task execution in heterogeneous compute devices.

The following area of the screenshots page shows some of the compute capabilities:

https://bbguimaraes.com/nngn/screenshots/compute.html

Lua

The compute back end is exposed to Lua via the nngn.compute variable. Compiling a program and executing a kernel is done similarly to the C++ API:

prog = nngn.compute:create_prog(io.open("prog.cl"):read("a"))
nngn.compute:execute(prog, "fn", Compute.BLOCKING, {256, 256}, {16, 16}, {
Compute.FLOAT, 3.1415,
Compute.BYTEV, {0, 1, 2, 3},
})
auto compute(nngn::Compute *c)
Definition: lua_collision.cpp:24
bool execute(Compute &c, lua_Integer program, const char *func, Compute::ExecFlag flags, nngn::lua::table_view global_size, nngn::lua::table_view local_size, nngn::lua::table_view data, std::optional< nngn::lua::value_view > wait_opt, std::optional< nngn::lua::table_view > events_opt)
Definition: lua_compute.cpp:591
bool read(std::string_view filename, byte_range auto *v)
Definition: utils.cpp:14
Definition: audio.cpp:7

Compute.BLOCKING makes the execution synchronous. Kernels can also be executed concurrently (requires a device with an out-of-order queue) and synchronized using events:

events = {}
-- Last two arguments are wait list and output events.
nngn.compute:execute(prog, "k0", 0, {1}, {1}, {}, nil, events)
-- Reuse output.
nngn.compute:execute(prog, "k1", 0, {1}, {1}, {}, nil, events)
-- Wait for all previous events, reuse output.
nngn.compute:execute(prog, "k2", 0, {1}, {1}, {}, events, events)
-- Wait for all previous events and release them.
nngn.compute:wait(events)
nngn.compute:release_events(events)
auto wait(const Compute &c, std::vector< const void * > events)
Definition: lua_compute.cpp:466
bool release_events(const Compute &c, std::vector< const void * > events)
Definition: lua_compute.cpp:477
constexpr struct nngn::lua::nil_type nil
release
Definition: input.lua:46

Separate tables can be used to construct more complex task graphs.

Buffers

To create and populate a device buffer:

b = assert(nngn.compute:create_buffer(Compute.READ_WRITE, size))
v = Compute.create_vector(size)
Compute.fill_rnd_vector(v)
assert(nngn.compute:write_buffer(b, v))
assert
Definition: debug.lua:3
create_buffer
Definition: img_common.lua:37
auto size(const Colliders &c)
Definition: lua_collision.cpp:29
bool write_buffer(const Compute &c, lua_Integer b, lua_Integer off, lua_Integer n, Type type, const bvec &v)
Definition: lua_compute.cpp:381
v[1]
Definition: math.lua:19

Common operations on buffers are creation:

rw = Compute.READ_WRITE
assert(nngn.compute:create_buffer(rw, Compute.FLOATV, size))
-- From existing data.
assert(nngn.compute:create_buffer(
rw, Compute.FLOATV, size,
Compute.create_vector(1024)))
data
Definition: house0.lua:10

write:

assert(nngn.compute:write_buffer(b, offset, n, Compute.FLOATV, v))
n
Definition: dump_lights.lua:5
std::ptrdiff_t offset(const Entities &es, const Entity &e)
Definition: entity.cpp:20

and read:

assert(nngn.compute:read_buffer(b, Compute.FLOATV, n, v))
read_buffer
Definition: img_common.lua:35