Skip to content

feat: add dynamic buf_id support for pto.get_buf / pto.rls_buf#905

Open
kuri780 wants to merge 4 commits into
hw-native-sys:mainfrom
kuri780:feature/simt-sync-dynamic-bufid
Open

feat: add dynamic buf_id support for pto.get_buf / pto.rls_buf#905
kuri780 wants to merge 4 commits into
hw-native-sys:mainfrom
kuri780:feature/simt-sync-dynamic-bufid

Conversation

@kuri780

@kuri780 kuri780 commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Allow buf_id to be provided as a dynamic SSA value (index type) in addition to the existing static integer attribute. The two forms are mutually exclusive — exactly one must be provided.

This enables SIMT double-buffering patterns where buf_id is computed at runtime, e.g. (iter & 1) for ping-pong buffering.

Changes across layers:

  • ODS (PTOOps.td): buf_id attr → OptionalAttr, add buf_id_dyn operand
  • IR (PTO.cpp): verifier enforces mutual exclusion, custom assembly format handles both static/dynamic forms
  • VPTO LLVM emitter: static→GET.BUFI.mode (immediate), dynamic→ GET.BUF.mode (register)
  • CANN900 LLVM emitter: same pattern
  • EmitC: static passes attr, dynamic passes via operands
  • BufidSync pass: adapted to new constructor signature
  • Python DSL: get_buf/rls_buf accept int or SSA value for buf_id
  • Docs (17-simt.md): documented barrier, get_buf/rls_buf with both static and dynamic syntax

Test: simt-bufid-dynamic-core exercises dynamic buf_id from scf.for loop induction variable with ping-pong pattern, verified on simulator (compare passed).

@reedhecre

reedhecre commented Jul 7, 2026

Copy link
Copy Markdown

Codex Review

该评论由 review 机器人自动更新。

  • PR: feat: add dynamic buf_id support for pto.get_buf / pto.rls_buf #905 feat: add dynamic buf_id support for pto.get_buf / pto.rls_buf
  • Author: kuri780
  • Base/Head: main / feature/simt-sync-dynamic-bufid
  • Head SHA: 94964da27d79
  • Trigger: PR 有新提交
  • Generated At: 2026-07-08T06:25:49Z
  • Previous Head SHA: 107e2b81d685
  • Status: failed at codex-review (exit=1)

Summary

Review failed at stage codex-review: exit=1

Findings

未生成结构化 findings,因为 review 过程提前失败。

Log Tail

From https://github.com/hw-native-sys/PTOAS
 * [new ref]           refs/pull/905/head -> pr-905
From https://github.com/hw-native-sys/PTOAS
 * branch              main       -> FETCH_HEAD
Switched to branch 'pr-905'
94964da27d7940970a7c98032882d0a3f5770bd7
 docs/isa/micro-isa/01-pipeline-sync.md             |  26 ++++
 include/PTO/IR/PTOOps.td                           |  40 ++++++
 lib/PTO/IR/PTO.cpp                                 | 143 ++++++++++++++++++++-
 lib/PTO/Transforms/BufidSync/BufidSyncCodegen.cpp  |   2 +-
 lib/PTO/Transforms/PTOToEmitC.cpp                  |  60 +++++++++
 lib/PTO/Transforms/VPTOCANN900LLVMEmitter.cpp      |  73 ++++++++++-
 lib/PTO/Transforms/VPTOLLVMEmitter.cpp             |  73 ++++++++++-
 ptodsl/ptodsl/_ops.py                              |  36 +++++-
 ptodsl/ptodsl/pto.py                               |   2 +-
 .../simt/simt-bufid-dynamic-core/compare.py        |  33 +++++
 .../simt/simt-bufid-dynamic-core/golden.py         |  37 ++++++
 .../simt/simt-bufid-dynamic-core/kernel.pto        |  49 +++++++
 .../simt/simt-bufid-dynamic-core/launch.cpp        |  18 +++
 .../micro-op/simt/simt-bufid-dynamic-core/main.cpp |  56 ++++++++
 14 files changed, 637 insertions(+), 11 deletions(-)
===== END STAGE clone rc=0 @ 2026-07-08 14:25:41 =====

===== STAGE codex-review @ 2026-07-08 14:25:41 =====
set -euo pipefail
cd '/tmp/ptoas-pr-review-monitor/runs/20260708_142533_pr905/repo'
'codex' exec -C '/tmp/ptoas-pr-review-monitor/runs/20260708_142533_pr905/repo' -s read-only -c 'model_provider="codereview"' -c 'model="gpt-5.4"' -c 'model_reasoning_effort="xhigh"' --output-schema '/tmp/ptoas-pr-review-monitor/runs/20260708_142533_pr905/review_schema.json' -o '/tmp/ptoas-pr-review-monitor/runs/20260708_142533_pr905/codex_last_message.json' --color never - < '/tmp/ptoas-pr-review-monitor/runs/20260708_142533_pr905/review_prompt.txt'
[monitor] stage timeout: 1800s
OpenAI Codex v0.115.0 (research preview)
--------
workdir: /tmp/ptoas-pr-review-monitor/runs/20260708_142533_pr905/repo
model: gpt-5.4
provider: codereview
approval: never
sandbox: read-only
reasoning effort: xhigh
reasoning summaries: none
session id: 019f4067-564f-7132-945b-982142b8acca
--------
user
你现在在审查 GitHub PR。

仓库:hw-native-sys/PTOAS
PR:#905 feat: add dynamic buf_id support for pto.get_buf / pto.rls_buf
作者:kuri780
base branch:origin/main
head branch:HEAD(当前已 checkout 到 PR head)

要求:
1. 只审查这个 PR 相对 origin/main 的改动,必要时可以看上下文文件。
2. 重点找真实的 correctness / regression / contract mismatch / CI / runtime / compatibility 问题。
3. 不要提纯风格建议,不要提低价值猜测。
4. 严格按优先级输出:
   - P1:高概率会导致错误结果、编译/运行失败、严重回归、发布阻断
   - P2:重要缺陷、行为回归、遗漏校验/测试、较大兼容性问题
   - P3:次要但明确可改的问题
5. 如果没有问题,summary 直接写:未检查到 PR #905 存在问题,并返回 findings=[]。
6. 如果有问题,summary 简洁概括,findings 里每条都要给出:
   - severity
   - title
   - body(说明为什么是问题,尽量具体)
   - file(尽量给相对路径)
   - line(能确定就填整数,否则 null)

建议先查看:
- git status --short
- git diff --stat origin/main...HEAD
- git diff --unified=80 origin/main...HEAD

最终输出必须严格匹配 JSON schema。

mcp startup: no servers
Reconnecting... 1/5 (unexpected status 403 Forbidden: {"code":"INSUFFICIENT_BALANCE","message":"Insufficient account balance"}, url: https://codex.0u0o.com/responses, cf-ray: a17d035e4cc055a3-LAX, request id: d1e3927d-e396-463a-8473-ca331a716bce)
Reconnecting... 2/5 (unexpected status 403 Forbidden: {"code":"INSUFFICIENT_BALANCE","message":"Insufficient account balance"}, url: https://codex.0u0o.com/responses, cf-ray: a17d0360fd315e6f-LAX, request id: 6940850f-ed20-4714-a846-db166a93f2a9)
Reconnecting... 3/5 (unexpected status 403 Forbidden: {"code":"INSUFFICIENT_BALANCE","message":"Insufficient account balance"}, url: https://codex.0u0o.com/responses, cf-ray: a17d03650e4bc121-LAS, request id: bbb61463-21c2-49d5-9d3b-a56858c08012)
Reconnecting... 4/5 (unexpected status 403 Forbidden: {"code":"INSUFFICIENT_BALANCE","message":"Insufficient account balance"}, url: https://codex.0u0o.com/responses, cf-ray: a17d036b5b119d07-LAS, request id: 4fac0c25-59f6-415e-ac25-8a5ea771533c)
Reconnecting... 5/5 (unexpected status 403 Forbidden: {"code":"INSUFFICIENT_BALANCE","message":"Insufficient account balance"}, url: https://codex.0u0o.com/responses, cf-ray: a17d037739283a69-LAX, request id: 8abb4b48-564c-4e85-ab6d-0cfa10912e7d)
ERROR: unexpected status 403 Forbidden: {"code":"INSUFFICIENT_BALANCE","message":"Insufficient account balance"}, url: https://codex.0u0o.com/responses, cf-ray: a17d038ada4cc1fe-LAX, request id: e75c29b6-91a3-4d65-8a9a-a42a0e03f5da
Warning: no last agent message; wrote empty content to /tmp/ptoas-pr-review-monitor/runs/20260708_142533_pr905/codex_last_message.json
===== END STAGE codex-review rc=1 @ 2026-07-08 14:25:49 =====

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces support for dynamic buffer-ID synchronization in SIMT kernels by updating pto.get_buf and pto.rls_buf to accept an optional dynamic SSA value in addition to the static attribute. The changes span the ODS definitions, parser, printer, verifier, EmitC conversion, LLVM emitters, and Python DSL, and include a new SIMT test case. The review feedback focuses on refactoring opportunities to eliminate code duplication in the parser and printer, removing redundant Attribute casts, and improving efficiency by avoiding unnecessary StringAttr lookups in the LLVM emitters.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment thread lib/PTO/IR/PTO.cpp
Comment on lines 7802 to 7804
static ParseResult parseBufSyncOp(OpAsmParser &parser, OperationState &result) {
Attribute opTypeAttr;
IntegerAttr bufIdAttr;
IntegerAttr modeAttr;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

To avoid duplicating the 15-line parsing logic for the optional dynamic/static buffer ID, we can extract it into a helper lambda at the beginning of parseBufSyncOp.

static ParseResult parseBufSyncOp(OpAsmParser &parser, OperationState &result) {
  Attribute opTypeAttr;
  IntegerAttr modeAttr;

  auto parseBufId = [&]() -> ParseResult {
    OpAsmParser::UnresolvedOperand bufOperand;
    OptionalParseResult parseBufOperand =
        parser.parseOptionalOperand(bufOperand);
    if (parseBufOperand.has_value()) {
      if (failed(*parseBufOperand))
        return failure();
      return parser.resolveOperand(bufOperand,
                                   parser.getBuilder().getIndexType(),
                                   result.operands);
    }
    IntegerAttr bufIdAttr;
    if (parseI32LiteralAttr(parser, bufIdAttr))
      return failure();
    result.addAttribute("buf_id", bufIdAttr);
    return success();
  };

Comment thread lib/PTO/IR/PTO.cpp Outdated
Comment on lines +7819 to +7834
OpAsmParser::UnresolvedOperand bufOperand;
OptionalParseResult parseBufOperand =
parser.parseOptionalOperand(bufOperand);
if (parseBufOperand.has_value()) {
if (failed(*parseBufOperand))
return failure();
if (parser.resolveOperand(bufOperand,
parser.getBuilder().getIndexType(),
result.operands))
return failure();
} else {
IntegerAttr bufIdAttr;
if (parseI32LiteralAttr(parser, bufIdAttr))
return failure();
result.addAttribute("buf_id", bufIdAttr);
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Use the helper lambda parseBufId here to simplify the parsing logic and eliminate code duplication.

Suggested change
OpAsmParser::UnresolvedOperand bufOperand;
OptionalParseResult parseBufOperand =
parser.parseOptionalOperand(bufOperand);
if (parseBufOperand.has_value()) {
if (failed(*parseBufOperand))
return failure();
if (parser.resolveOperand(bufOperand,
parser.getBuilder().getIndexType(),
result.operands))
return failure();
} else {
IntegerAttr bufIdAttr;
if (parseI32LiteralAttr(parser, bufIdAttr))
return failure();
result.addAttribute("buf_id", bufIdAttr);
}
if (failed(parseBufId()))
return failure();

Comment thread lib/PTO/IR/PTO.cpp Outdated
Comment on lines +7846 to +7861
OpAsmParser::UnresolvedOperand bufOperand;
OptionalParseResult parseBufOperand =
parser.parseOptionalOperand(bufOperand);
if (parseBufOperand.has_value()) {
if (failed(*parseBufOperand))
return failure();
if (parser.resolveOperand(bufOperand,
parser.getBuilder().getIndexType(),
result.operands))
return failure();
} else {
IntegerAttr bufIdAttr;
if (parseI32LiteralAttr(parser, bufIdAttr))
return failure();
result.addAttribute("buf_id", bufIdAttr);
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Use the helper lambda parseBufId here to simplify the parsing logic and eliminate code duplication.

Suggested change
OpAsmParser::UnresolvedOperand bufOperand;
OptionalParseResult parseBufOperand =
parser.parseOptionalOperand(bufOperand);
if (parseBufOperand.has_value()) {
if (failed(*parseBufOperand))
return failure();
if (parser.resolveOperand(bufOperand,
parser.getBuilder().getIndexType(),
result.operands))
return failure();
} else {
IntegerAttr bufIdAttr;
if (parseI32LiteralAttr(parser, bufIdAttr))
return failure();
result.addAttribute("buf_id", bufIdAttr);
}
if (failed(parseBufId()))
return failure();

Comment thread lib/PTO/IR/PTO.cpp
Comment on lines 7886 to 7914
if (auto pipeAttr = dyn_cast<PipeAttr>(opTypeAttr)) {
p << " \"" << stringifyPIPE(pipeAttr.getPipe()) << "\", "
<< bufIdAttr.getInt() << ", " << modeAttr.getInt();
p << " \"" << stringifyPIPE(pipeAttr.getPipe()) << "\", ";
if (bufIdAttr)
p << bufIdAttr.getInt();
else
p << bufIdDyn;
p << ", " << modeAttr.getInt();
} else if (auto pipeEventType = dyn_cast<PipeEventTypeAttr>(opTypeAttr)) {
p << "[" << opTypeAttr << ", " << bufIdAttr.getInt() << ", "
<< modeAttr.getInt() << "]";
p << "[" << opTypeAttr << ", ";
if (bufIdAttr)
p << bufIdAttr.getInt();
else
p << bufIdDyn;
p << ", " << modeAttr.getInt() << "]";
} else if (auto syncOpType = dyn_cast<SyncOpTypeAttr>(opTypeAttr)) {
p << "[" << opTypeAttr << ", " << bufIdAttr.getInt() << ", "
<< modeAttr.getInt() << "]";
p << "[" << opTypeAttr << ", ";
if (bufIdAttr)
p << bufIdAttr.getInt();
else
p << bufIdDyn;
p << ", " << modeAttr.getInt() << "]";
} else {
p << "[" << opTypeAttr << ", " << bufIdAttr.getInt() << ", "
<< modeAttr.getInt() << "]";
p << "[" << opTypeAttr << ", ";
if (bufIdAttr)
p << bufIdAttr.getInt();
else
p << bufIdDyn;
p << ", " << modeAttr.getInt() << "]";
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The printing of the buffer ID and mode is duplicated across all branches of the if-else chain. We can simplify this by factoring out the common printing logic.

  if (auto pipeAttr = dyn_cast<PipeAttr>(opTypeAttr)) {
    p << " \"" << stringifyPIPE(pipeAttr.getPipe()) << "\", ";
  } else {
    p << "[" << opTypeAttr << ", ";
  }

  if (bufIdAttr)
    p << bufIdAttr.getInt();
  else
    p << bufIdDyn;
  p << ", " << modeAttr.getInt();

  if (!isa<PipeAttr>(opTypeAttr))
    p << "]";

Comment on lines +91 to +94
rewriter.create<pto::GetBufOp>(
op->getLoc(), Attribute(opTypeAttr),
rewriter.getI32IntegerAttr(static_cast<int32_t>(physicalId)),
rewriter.getI32IntegerAttr(0), Value());

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The cast Attribute(opTypeAttr) is redundant because opTypeAttr is already declared as an Attribute.

Suggested change
rewriter.create<pto::GetBufOp>(
op->getLoc(), Attribute(opTypeAttr),
rewriter.getI32IntegerAttr(static_cast<int32_t>(physicalId)),
rewriter.getI32IntegerAttr(0), Value());
rewriter.create<pto::GetBufOp>(
op->getLoc(), opTypeAttr,
rewriter.getI32IntegerAttr(static_cast<int32_t>(physicalId)),
rewriter.getI32IntegerAttr(0), Value());

Comment on lines +112 to +115
rewriter.create<pto::RlsBufOp>(
op->getLoc(), Attribute(opTypeAttr),
rewriter.getI32IntegerAttr(static_cast<int32_t>(physicalId)),
rewriter.getI32IntegerAttr(0), Value());

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The cast Attribute(opTypeAttr) is redundant because opTypeAttr is already declared as an Attribute.

Suggested change
rewriter.create<pto::RlsBufOp>(
op->getLoc(), Attribute(opTypeAttr),
rewriter.getI32IntegerAttr(static_cast<int32_t>(physicalId)),
rewriter.getI32IntegerAttr(0), Value());
rewriter.create<pto::RlsBufOp>(
op->getLoc(), opTypeAttr,
rewriter.getI32IntegerAttr(static_cast<int32_t>(physicalId)),
rewriter.getI32IntegerAttr(0), Value());

Comment on lines +8663 to +8668
if constexpr (std::is_same_v<BufSyncOp, pto::GetBufOp>)
calleeName = StringAttr::get(op.getContext(), "llvm.hivm.GET.BUF.mode")
.getValue();
else
calleeName = StringAttr::get(op.getContext(), "llvm.hivm.RLS.BUF.mode")
.getValue();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Using StringAttr::get(...).getValue() is inefficient because it performs a lookup/insertion in the MLIR context's hash map. Since calleeName is a StringRef, you can assign string literals directly.

Suggested change
if constexpr (std::is_same_v<BufSyncOp, pto::GetBufOp>)
calleeName = StringAttr::get(op.getContext(), "llvm.hivm.GET.BUF.mode")
.getValue();
else
calleeName = StringAttr::get(op.getContext(), "llvm.hivm.RLS.BUF.mode")
.getValue();
if constexpr (std::is_same_v<BufSyncOp, pto::GetBufOp>)
calleeName = "llvm.hivm.GET.BUF.mode";
else
calleeName = "llvm.hivm.RLS.BUF.mode";

Comment thread lib/PTO/Transforms/VPTOLLVMEmitter.cpp Outdated
Comment on lines +8607 to +8612
if constexpr (std::is_same_v<BufSyncOp, pto::GetBufOp>)
calleeName = StringAttr::get(op.getContext(), "llvm.hivm.GET.BUF.mode")
.getValue();
else
calleeName = StringAttr::get(op.getContext(), "llvm.hivm.RLS.BUF.mode")
.getValue();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Using StringAttr::get(...).getValue() is inefficient because it performs a lookup/insertion in the MLIR context's hash map. Since calleeName is a StringRef, you can assign string literals directly.

Suggested change
if constexpr (std::is_same_v<BufSyncOp, pto::GetBufOp>)
calleeName = StringAttr::get(op.getContext(), "llvm.hivm.GET.BUF.mode")
.getValue();
else
calleeName = StringAttr::get(op.getContext(), "llvm.hivm.RLS.BUF.mode")
.getValue();
if constexpr (std::is_same_v<BufSyncOp, pto::GetBufOp>)
calleeName = "llvm.hivm.GET.BUF.mode";
else
calleeName = "llvm.hivm.RLS.BUF.mode";

Comment thread docs/isa/micro-isa/17-simt.md Outdated
// Safe to load MTE result from UB
```

### Buffer-ID Synchronization (`pto.get_buf` / `pto.rls_buf`)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个应该不是simt里边的指令,应该放到同步指令中

Comment thread include/PTO/IR/PTOOps.td Outdated
PTO_PipeLikeAttr:$op_type,
I32Attr:$buf_id,
DefaultValuedAttr<I32Attr, "0">:$mode
OptionalAttr<I32Attr>:$buf_id,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

我建议是新增GetBufDynOp,参考WaitFlagOp和WaitFlagDynOp的形式。整体更清楚一些。

kuri780 and others added 4 commits July 8, 2026 14:20
Allow buf_id to be provided as a dynamic SSA value (index type) in
addition to the existing static integer attribute. The two forms are
mutually exclusive — exactly one must be provided.

This enables SIMT double-buffering patterns where buf_id is computed at
runtime, e.g. (iter & 1) for ping-pong buffering.

Changes across layers:
- ODS (PTOOps.td): buf_id attr → OptionalAttr, add buf_id_dyn operand
- IR (PTO.cpp): verifier enforces mutual exclusion, custom assembly
  format handles both static/dynamic forms
- VPTO LLVM emitter: static→GET.BUFI.mode (immediate), dynamic→
  GET.BUF.mode (register)
- CANN900 LLVM emitter: same pattern
- EmitC: static passes attr, dynamic passes via operands
- BufidSync pass: adapted to new constructor signature
- Python DSL: get_buf/rls_buf accept int or SSA value for buf_id
- Docs (17-simt.md): documented barrier, get_buf/rls_buf with both
  static and dynamic syntax

Test: simt-bufid-dynamic-core exercises dynamic buf_id from scf.for
loop induction variable with ping-pong pattern, verified on simulator
(compare passed).
Split GetBufOp/RlsBufOp into separate static and dynamic variants,
following the WaitFlagOp / WaitFlagDynOp pattern:

- GetBufOp / RlsBufOp: static buf_id (I32Attr), used by BufidSync pass
- GetBufDynOp / RlsBufDynOp: dynamic buf_id (Index operand), for
  runtime-computed patterns like SIMT ping-pong buffering

This replaces the previous approach of a single op with OptionalAttr +
Optional operand and a mutual-exclusion verifier. Each op now has a
clean, focused definition without branching in consumers.

Changes across layers:
- ODS (PTOOps.td): revert GetBufOp/RlsBufOp to static-only, add
  GetBufDynOp/RlsBufDynOp with hasCustomAssemblyFormat
- IR (PTO.cpp): separate verifiers, parsers, and printers for static
  and dynamic variants
- LLVM emitters (VPTO + CANN900): static→GET.BUFI.mode (immediate),
  dynamic→GET.BUF.mode (register) via separate patterns
- EmitC: separate patterns for static (attr) and dynamic (operand)
  buf_id
- BufidSync: revert to simpler constructor (static-only)
- Python DSL: get_buf/rls_buf for static int, get_buf_dyn/rls_buf_dyn
  for SSA value
- Docs: move dynamic buf_id docs from 17-simt.md to 01-pipeline-sync.md,
  keep brief reference in SIMT doc
- Test: update kernel.pto to use get_buf_dyn/rls_buf_dyn

Co-Authored-By: Claude <noreply@anthropic.com>
The dynamic variants of get_buf/rls_buf were missing from the
addIllegalOp list in configureVPTOOpLoweringTarget(). Their lowering
patterns (LowerBufDynSyncOpPattern) were registered but never fired,
leaving index-typed buf_id operands unconverted. The type conversion
framework then injected unrealized_conversion_cast ops that failed
LLVM translation.

Add pto::GetBufDynOp and pto::RlsBufDynOp to the illegal op list in
both VPTOLLVMEmitter and VPTOCANN900LLVMEmitter, consistent with the
existing static GetBufOp/RlsBufOp entries.

Co-Authored-By: Claude <noreply@anthropic.com>
The syncthreads memory ordering contract, pto.barrier section, and
dynamic buf_id cross-reference note are independent documentation
improvements that do not belong to the dynamic buf_id feature.
They should be submitted as a separate docs-only PR.

Co-Authored-By: Claude <noreply@anthropic.com>
@kuri780 kuri780 force-pushed the feature/simt-sync-dynamic-bufid branch from 107e2b8 to 94964da Compare July 8, 2026 06:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants