Compute back ends.
More...
Compute back ends.
Compute back ends for task execution in heterogeneous compute devices.
- OpenCLBackend: main/default OpenCL 1/2 back end.
- Pseudocomp: fake back end for testing.
- An absent back end is also supported, in which case native CPU code is used.
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},
})
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)
auto compute(nngn::Compute *c)
Definition lua_collision.cpp:24
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
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
constexpr struct nngn::lua::nil_type nil
Separate tables can be used to construct more complex task graphs.
Buffers
To create and populate a device buffer:
v = Compute.create_vector(size)
Compute.fill_rnd_vector(
v)
assert
Definition debug.lua:3
create_buffer
Definition img_common.lua:37
v[1]
Definition math.lua:22
Common operations on buffers are creation:
rw = Compute.READ_WRITE
rw, Compute.FLOATV, size,
Compute.create_vector(1024)))
local data
Definition house0.lua:10
write:
assert(
nngn.compute:write_buffer(b, offset,
n, Compute.FLOATV,
v))
local n
Definition dump_lights.lua:5
and read:
read_buffer
Definition img_common.lua:35