Using RsimdDispatch in Other Packages

Downstream packages use RsimdDispatch as a template and header provider. The usual workflow is:

  1. call use_simd_dispatch() from the package root;
  2. replace the demo count_nonzero() kernels with package-specific kernels;
  3. keep CPU detection, dispatch, and R API files compiled by R’s ordinary src/Makevars path;
  4. let configure stage scalar and ISA-specific kernel objects before linking one shared library.

use_simd_dispatch() updates DESCRIPTION, adding RsimdDispatch to LinkingTo, and copies package-specific scaffold files. It does not add a runtime dependency on RsimdDispatch. The LinkingTo entry makes bundled SIMDe headers available to C code:

#include <simde/x86/avx2.h>
#include <simde/arm/neon.h>

Copy the scaffold

From the downstream package root:

RsimdDispatch::use_simd_dispatch(pkg = "MyPackage", prefix = "mypkg")

If pkg is omitted, the package name is read from DESCRIPTION. If prefix is omitted, a lowercase C identifier prefix is derived from the package name. The helper performs the important substitutions, including @useDynLib, R_init_<Package>(), rsd_, RSD_, and RC_ symbols.

The copied scaffold includes:

configure
configure.win
cleanup
tools/configure-simd-dispatch.sh
tools/kernels/kernel_scalar.c
tools/kernels/kernel_sse2.c
tools/kernels/kernel_sse41.c
tools/kernels/kernel_avx2.c
tools/kernels/kernel_avx512.c
tools/kernels/kernel_neon.c
src/Makevars.in
src/Makevars.win.in
src/cpu_features.c
src/simd_dispatch.c

Replace the demo kernel

The demo kernel has this shape:

typedef size_t (*rsd_count_nonzero_fn)(const uint8_t *x, size_t n);

For a real package, replace the demo kernel signature with your own and keep the same structure:

R API wrapper        ordinary src/Makevars compilation
CPU feature checks   ordinary src/Makevars compilation
dispatch table       ordinary src/Makevars compilation
scalar kernel        staged by configure under src/rsd-kernels/
SSE/AVX/NEON files   staged by configure as optional objects under src/rsd-kernels/

Do not put -mavx2, -mavx512*, or -march=native in global package flags. The configure helper keeps ISA flags local to optional staged kernel objects, and the dispatcher remains safe on baseline CPUs.

Build

The generated configure checks compiler support, writes src/config.h plus src/Makevars, and stages selected kernel objects in src/rsd-kernels/. Runtime CPU support is checked later by the installed package:

R CMD INSTALL .