Skip to content

OpenCL Backend ​

Generate OpenCL kernel code from dew expressions.

Enable ​

toml
dew-scalar = { version = "0.1", features = ["opencl"] }
dew-linalg = { version = "0.1", features = ["opencl"] }

dew-scalar ​

Generate Expression ​

rust
use dew_core::Expr;
use dew_scalar::opencl::emit_opencl;

let expr = Expr::parse("sin(x) + cos(y)").unwrap();
let ocl = emit_opencl(expr.ast()).unwrap();

println!("{}", ocl.code);
// Output: (sin(x) + cos(y))

Generate Kernel Function ​

rust
use dew_scalar::opencl::emit_opencl_fn;

let expr = Expr::parse("x * x + y * y").unwrap();
let ocl = emit_opencl_fn("distance_squared", expr.ast(), &["x", "y"]).unwrap();

println!("{}", ocl);
// Output:
// float distance_squared(float x, float y) {
//     return ((x * x) + (y * y));
// }

dew-linalg ​

Generate with Types ​

rust
use dew_core::Expr;
use dew_linalg::opencl::emit_opencl;
use dew_linalg::Type;
use std::collections::HashMap;

let expr = Expr::parse("dot(a, b)").unwrap();

let mut var_types: HashMap<String, Type> = HashMap::new();
var_types.insert("a".to_string(), Type::Vec3);
var_types.insert("b".to_string(), Type::Vec3);

let result = emit_opencl(expr.ast(), &var_types).unwrap();

println!("{}", result.code);
// Output: dot(a, b)

OpenCL Features ​

Built-in Vector Types ​

OpenCL provides native vector types:

dew TypeOpenCL Type
Scalarfloat
Vec2float2
Vec3float3
Vec4float4

Built-in Vector Operations ​

OpenCL has built-in functions for common vector operations:

dewOpenCL
dot(a, b)dot(a, b)
cross(a, b)cross(a, b)
length(v)length(v)
normalize(v)normalize(v)
distance(a, b)distance(a, b)

Vector Constructors ​

c
// OpenCL uses cast-style constructors
(float2)(x, y)
(float3)(x, y, z)
(float4)(x, y, z, w)

Function Mapping ​

dewOpenCL
sin(x)sin(x)
cos(x)cos(x)
sqrt(x)sqrt(x)
rsqrt(x)rsqrt(x)
abs(x)fabs(x)
floor(x)floor(x)
x ^ ypow(x, y)
min(a, b)fmin(a, b)
max(a, b)fmax(a, b)
pi()M_PI_F
lerp(a, b, t)mix(a, b, t)
clamp(x, lo, hi)clamp(x, lo, hi)

Comparison with CUDA/HIP ​

FeatureOpenCLCUDA/HIP
PlatformCross-platformNVIDIA/AMD
Vector constructors(float2)(x, y)make_float2(x, y)
Built-in dot/crossYesRequires helpers
Math functionssin()sinf()
ConstantsM_PI_FM_PI

Use Cases ​

  • Cross-platform GPU compute: Run on NVIDIA, AMD, Intel, and mobile GPUs
  • Heterogeneous computing: CPU + GPU on same platform
  • FPGA acceleration: OpenCL targets some FPGAs