Chapel 中的稀疏迭代
Sparse Iteration in Chapel
在 sps = sparse subdomain(dom)
上给定一个数组 M:[sps]
,其中 dom: domain(n)
,我知道我可以使用 for j in M.domain.dim(k) {...}
在第 k 个维度上进行密集迭代。我将如何定义一个类似的循环,它只访问 k 中填充的位置,这样如果 M.domain.dim(k) = {1..N}
,但 k 中只有 m 个填充的索引,循环只正式生成 m 次迭代而不是 N?
这样做的方法是用一个只引用一个索引的 iterand 遍历整个稀疏域吗? (即 for (i,j) in spsDom { var idx = i }
)
除了 之外,我对这个问题没有太多答案。快速总结是有一个未记录的迭代器 dimIter()
可用于迭代以 2D CSR/CSC 格式存储的稀疏域的有效维度,但没有官方接口可以执行此操作这适用于今天的所有稀疏域(从 Chapel 1.16 版开始)。
我认为我们最终想要表达的方式是 support slicing of sparse domains 然后遍历该切片。
在 sps = sparse subdomain(dom)
上给定一个数组 M:[sps]
,其中 dom: domain(n)
,我知道我可以使用 for j in M.domain.dim(k) {...}
在第 k 个维度上进行密集迭代。我将如何定义一个类似的循环,它只访问 k 中填充的位置,这样如果 M.domain.dim(k) = {1..N}
,但 k 中只有 m 个填充的索引,循环只正式生成 m 次迭代而不是 N?
这样做的方法是用一个只引用一个索引的 iterand 遍历整个稀疏域吗? (即 for (i,j) in spsDom { var idx = i }
)
除了 dimIter()
可用于迭代以 2D CSR/CSC 格式存储的稀疏域的有效维度,但没有官方接口可以执行此操作这适用于今天的所有稀疏域(从 Chapel 1.16 版开始)。
我认为我们最终想要表达的方式是 support slicing of sparse domains 然后遍历该切片。