decuda 0.1.1

CUDA to HIP, SYCL, OpenCL, and Rust GPU migration tool — automatic source-code translator for porting CUDA C++ kernels to AMD ROCm HIP, Intel oneAPI SYCL, Khronos OpenCL, and Rust GPU (cust / rust-gpu)
Documentation
// Generated by decuda.
// SYCL kernels replace CUDA kernels with parallel_for lambdas; this
// output is a *starting point* and almost always requires manual
// follow-up. Look for the `TODO(decuda)` markers in this file.

#include <sycl/sycl.hpp>

// Richer fixture exercising atomics, shared memory, syncthreads, warp
// intrinsics, 2D launches, and a constant-memory global.
#include <sycl/sycl.hpp> /* was: cuda_runtime.h */

#define N 1024

/* constant -> SYCL constant_accessor */ float kCoefficients[8];

// TODO(decuda): rewrite as SYCL kernel lambda
 void increment_atomic(int* counter, int delta) {
    int prev = atomicAdd(counter, delta);
    if (item.get_local_id() == 0) {
        atomicCAS(counter, prev, prev + 1);
    }
}

// TODO(decuda): rewrite as SYCL kernel lambda
 void warp_scan(const int* in, int* out) {
    __shared__ int buf[32];
    int lane = item.get_sub_group().get_local_id()();
    int wid = item.get_local_id() / 32;
    buf[lane] = in[item.get_local_id()];
    /* no native syncwarp on SYCL */ item.barrier() /* fallback */;
    if (lane == 0) {
        int s = 0;
        for (int i = 0; i < 32; ++i) s += buf[i];
        out[wid] = s;
    }
    item.barrier(sycl::access::fence_space::global_space);
}

// TODO(decuda): rewrite as SYCL kernel lambda
 void matmul(const float* a, const float* b, float* c,
                       int m, int n, int k) {
    int row = item.get_group(0) * item.get_local_range() + item.get_local_id();
    int col = item.get_group(0) * item.get_local_range() + item.get_local_id();
    if (row < m && col < n) {
        float s = kCoefficients[0] * a[row * k] * b[col];
        c[row * n + col] = s;
    }
}

void launch_examples(int* counter, float* a, float* b, float* c) {
    dim3 grid(N / 32, N / 16);
    dim3 block(32, 16);
    { /* decuda SYCL launch: queue.submit([&](sycl::handler& h) { h.parallel_for(sycl::range<3>{grid}, [=](sycl::item<3> it) { /* kernel `increment_atomic` body with thread indices from it.get_*() */ }); }); smem=none stream=default args=counter, 1 */ };
    { /* decuda SYCL launch: queue.submit([&](sycl::handler& h) { h.parallel_for(sycl::range<3>{1}, [=](sycl::item<3> it) { /* kernel `warp_scan` body with thread indices from it.get_*() */ }); }); smem=none stream=default args=counter, a */ };
    { /* decuda SYCL launch: queue.submit([&](sycl::handler& h) { h.parallel_for(sycl::range<3>{grid}, [=](sycl::item<3> it) { /* kernel `matmul` body with thread indices from it.get_*() */ }); }); smem=none stream=default args=a, b, c, N, N, N */ };
}