当前从描述看未能理解您的问题,能否重新描述下您的具体问题?比如对某个具体SIMT接口使用有疑问或哪种使用方式有疑问?还是对某个具体场景的运作逻辑有疑问?


当前从描述看未能理解您的问题,能否重新描述下您的具体问题?比如对某个具体SIMT接口使用有疑问或哪种使用方式有疑问?还是对某个具体场景的运作逻辑有疑问?
@goodpeople233
就是想确认一下:AIV 单核内多个 SIMT 线程并发对 UB 的不同地址做 32-bit atomic CAS(用于 byte max)时,除了 asc_syncthreads() 还需要额外同步/写回吗,还是这种 UB 多地址小粒度原子聚合本身就不支持?
我弄了个复现脚本,您那边看看?
对照:
1 核 × 1024 线程:8KB 私有 UB sketch 全部 8192 字节与参考一致;
8 核 × 1024 线程:每块只剩 ~1/8(1024 字节)被更新且值正确,其余 7168 字节从未写入、保持 0——更新在多核下静默丢失约 7/8,核数越多丢得越多。


@m0_66826439 已确认非接口不支持及需要额外同步/写回,当前附件有问题主要为脚本bug,初步确认到LocalSketchKernel的stride计算有误,请进一步排查。


@m0_66826439 已确认非接口不支持及需要额外同步/写回,当前附件有问题主要为脚本bug,初步确认到LocalSketchKernel的stride计算有误,请进一步排查。
豪德,我去看看


@goodpeople233 我好像发现问题了!!谢谢解答,确实是来资于LocalSketchKernel 这个kenel的问题,我改为按块内线程号遍历后 1 核与 8 核均 100% 正确,另外实测该聚合路径并不比逐 key GM 原子快(56 核约 0.56x),性能结论不变,谢谢指正。麻烦帮忙关闭下


/close


开发 9 月社区任务「hyperloglog容器开发(950)」(对标 NVIDIA cuCollections
hyperloglog,使用仓库 BloomFilter 的 SIMT 工程范式)时,需要复刻 cuCollections 的 Add 路径:所有线程按网格 stride 处理 key,先在每个 AIV 核各自的局部 scratch(UB)中做 sketch 聚合(原子字节位 max),块结束再合并回全局。实测在 Atlas 950 + CANN 9.1.0 下,单核(1 block × 1024 线程)完全正确,但多核(8 block × 1024 线程)并发时每个 block 的局部 UB 聚合大量丢失:8192 字节的局部 sketch 仅约 1/8(≈1024 字节)的寄存器被更新,其余仍为 0;核数越多丢失越严重。 这导致 HLL Add 只能退化为逐 key 全局原子更新(1e8 次约 2.8~5.2ms),无法达到任务书性能基线 0.4×(8KB 档预算≈0.79ms)。Environment / 环境信息(必填)
npu-smi info见 Ascend950PR)/usr/local/Ascend/cann-9.1.0)/usr/local/Ascend/cann-9.1.0/tools/ccec_compiler/bin/bisheng),-x asc --npu-arch=dav-3510 -O3kernel_operator.h+simt_api/device_atomic_functions.h+simt_api/device_sync_functions.h+simt_api/cpp/kernel_simt_atomic_intf.hKernel<<<numBlocks, launchBytes, aclrtStream>>>(...),内部AscendC::Simt::VF_CALL<...>(AscendC::Simt::Dim3{1024}, ...)Steps to reproduce the issue / 重现步骤(必填)
构造最小内核(每 block):
__ubuf__ uint8_t ls[8192]、动态get_imm(0)、动态+blockIdx*8192偏移);globalThreadIndexstride 清零该 8192B;asc_syncthreads();HashRank(复用仓库 hash_functions 的 xxhash64)→ 对该 block 自己的 UB sketch 做 32 位字 CAS 的字节位 max 更新(同一寄存器被多线程竞争);asc_syncthreads();out[blockIdx*8192 + i]),host 读取并与"宿主全量参考 sketch"(逐 key 求寄存器 max)逐字节比对。已尝试的变体(均无效,结果完全相同:每个 block 约 7168/8192 的寄存器仍为 0):
__ubuf__数组;get_imm(0),launchBytes = 8192;get_imm(0),launchBytes = 8 × 8192;get_imm(0) + blockIdx × 8192(per-block 偏移寻址);asc_syncthreads()。对照验证(同模型下可用的原语,均正常):
asc_syncthreads:均正常;Describe the expected behavior / 预期结果(必填)
期望:多核并发时,每个 AIV 核在其各自的局部 UB 上进行的(原子字节位 max)聚合能够正确保留全部更新(与单核结果一致),从而 HLL/类似容器可以把每核局部聚合与最后的 GM 合并路径作为高性能 Add 方案使用(对标 cuCollections 的 per-block 共享内存 sketch)。
Related log / screenshot / 日志 / 截图(必填)
8 block × 1024 线程、n=1e6、precision=13、每块 8192B 局部 sketch,与宿主参考逐字节比对结果:
单核对照:全部正确(bad=0)。
Special notes for this issue / 备注(选填)