【问题标题】:How to append a sparse domain in Chapel如何在教堂中附加稀疏域
【发布时间】:2017-07-22 15:24:17
【问题描述】:

我在 Chapel 中填充了一个稀疏数组,其中包含一个读取 CSV 的循环。

我想知道最好的模式是什么。

var dnsDom = {1..n_dims, 1..n_dims};
var spsDom: sparse subdomain(dnsDom);
for line in file_reader.lines() {
   var i = line[1]:int;
   var j = line[2]:int;
   spsDom += (i,j);
}

这是一种有效的方法吗?
我是否应该创建一个临时的元组数组并每(比如)10,000 行追加 spsDom

谢谢!

【问题讨论】:

  • 正如在 >>> stackoverflow.com/q/45172614 中提出的那样,您介意提供一些细节吗?如果效率的定量衡量标准是 aTimeDOMAIN 值,您是否测量了基线实现的Timer.start(); ... ;Timer.stop() 以引用此类基线以进行比较?如果定量测量是内存占用或其他一些标准,请您说明一下,以便其他人能够分享您对这种效率指标的期望吗?谢谢。 (如果您仍然可以为您之前的问题同时发布 repr( I ) + repr( V ),那就太好了。谢谢。)
  • 不要忽略,我一直在直接与 Chapel 团队合作,以解决其中的一些问题。我打算尽快更新/提供更好的答案
  • 伟大的一步,布莱恩。组合 [PTIME,PSPACE] 或 [EXPTIME,EXPSPACE] 双麻烦角的情况,靠近复杂动物园的物理边界总是具有挑战性的。在这两个主要的 Turing SEQ 处理维度中的另一个维度中,一个维度中的每个权衡显然都非常昂贵,如果不是完全不可行的话。感谢您的注意,将等待更新。
  • stackoverflow.com/q/45172614 对这篇文章进行机械更新方面有什么进展吗?就像输入repr( I ); repr( V ) + 复制/粘贴一样简单 - 这一切都应该在几秒钟内就可以了,不是吗?感谢您重新考虑,Brian,使帖子上下文清晰且专业。
  • 您是否介意提供有关稀疏矩阵的询问详细信息 - 正如上面记录和提醒的那样?谢谢你这样做。

标签: hpc chapel


【解决方案1】:

您在 sn-p 中显示的方式将在每次 += 操作时扩展稀疏域的内部数组。正如你所建议的;以某种方式缓冲读取的索引,然后批量添加它们肯定会因为添加索引数组的多项优化而表现得更好。

您可以类似地执行+=,其中右侧是一个数组:

spsDom += arrayOfIndices;

+= 运算符在稀疏域上的重载实际上是在调用主要的批量添加方法bulkAdd。该方法本身有几个标志,可以帮助您在某些情况下获得更高的性能。请注意,+= 重载以可能的“最安全”方式调用bulkAdd 方法。即索引数组可以是随机顺序,可以包含重复项等。如果您有数组(在您的情况下,您从文件中读取的索引)满足一些要求(它们是否有序?是否有重复项?您是否需要保留输入数组?),您可以直接使用bulkAdd 并传递几个优化标志。

请参阅http://chapel.cray.com/docs/latest/builtins/internal/ChapelArray.html#ChapelArray.bulkAdd 获取bulkAdd 的文档。

编辑:在有问题的建筑之上建造一个 sn-p:

var dnsDom = {1..n_dims, 1..n_dims};
var spsDom: sparse subdomain(dnsDom);

//create an index buffer
config const indexBufferSize = 100;
var indexBufferDom: {0..#indexBufferSize};
var indexBuffer: [indexBufferDom] 2*int;

var count = 0;
for line in file_reader.lines() {

  indexBuffer[count] = (line[1]:int, line[2]:int);
  count += 1;

  // bulk add indices if the buffer is full
  if count == indexBufferSize {
    spsDom.bulkAdd(indexBuffer, dataSorted=true,
                                preserveInds=false,
                                isUnique=true);
    count = 0;
  }
}

// dump the final buffer that is (most likely) partially filled
spsDom.bulkAdd(indexBuffer[0..#count],  dataSorted=true,
                                        preserveInds=false,
                                        isUnique=true);

我尚未对其进行测试,但我认为这应该能抓住基本思想。传递给 bulkAdd 的标志应该会产生最佳性能。当然,这取决于输入缓冲区被排序并且没有任何重复。另外,请注意,与连续的相比,初始的 bulkAdd 会快得多。而且它们可能会变慢,因为该方法需要筛选现有索引并在必要时对其进行移动。所以更大的缓冲区可以提供更好的性能。

【讨论】:

  • 你能提供一个代码 sn-p 来说明这一点吗?谢谢!
  • @BrianDolan 编辑了答案并添加了一个带有一些解释的 sn-p。
猜你喜欢
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
  • 2017-12-16
  • 2015-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-21
相关资源
最近更新 更多