// SPDX-FileCopyrightText: © 2026 Tenstorrent Inc. // SPDX-License-Identifier: Apache-2.0 // DRAM read bandwidth micro-benchmark (plain reads + one plain barrier at the end). // runtime: active, bank0, nbanks_rot, addr, chunk, reps, stride // read r: bank (bank0 + r) % nbanks_rot ... if nbanks_rot == 0, always bank0; offset (r / max(1,nrot)) * stride // data lands in a scratch CB (overwritten, contents irrelevant) #include #include "api/dataflow/dataflow_api.h" void kernel_main() { if (!get_arg_val(0)) { return; } const uint32_t bank0 = get_arg_val(1), nrot = get_arg_val(2); const uint32_t addr = get_arg_val(3), chunk = get_arg_val(4), reps = get_arg_val(5); const uint32_t stride = get_arg_val(6), lsize = get_arg_val(7); const uint32_t buf = get_write_ptr(0); uint32_t l = 0; for (uint32_t r = 0; r < reps; ++r) { const uint32_t bank = nrot ? (bank0 + r) % nrot : bank0; const uint32_t off = (nrot ? r / nrot : r) * stride; #ifdef L1_SRC // round 10: bank0 = (x << 8 | y) of a worker core, addr = an L1 address there (nrot must be 0) noc_async_read(get_noc_addr(bank0 >> 8, bank0 & 0xff, addr + off), buf + l, chunk); #else noc_async_read(get_noc_addr_from_bank_id(bank, addr + off), buf + l, chunk); #endif l += chunk; if (l + chunk > lsize) { l = 0; } } noc_async_read_barrier(); }