Bigint阵列上的多焦计算



我正在使用小礼拜堂,并且正在尝试在MultiLocale设置中对bigint阵列进行计算。读取一个包含一个整数的文件。每行被转换为bigint记录,然后将其插入到一个数组中。我有4个位置,因此我要求每个语言环境仅阅读输入文件的1/4,仅处理该部分。

我将问题减少到以下最小示例,这也受到影响:

module Hello {
use BigInteger;
use Math;
use Time;
config const inputPath = "/path/to/file";
config const inputSize = 10000000;
config const power = 2000;
proc dwriteln(args ...?n) {
        var curr = getCurrentTime(unit=TimeUnits.seconds);
        writeln("[ ", here.id, ": ", here.name, " ] [ ", curr, " ] ", (...args));
}
proc main() throws {
    writeln("Input path: ", inputPath);
    writeln("numLocales: ", numLocales);
    var elementsPerLocale = divceil(inputSize, numLocales);
    writeln("elementsPerLocale: ", elementsPerLocale);
    coforall loc in Locales {
        on loc {
            dwriteln("hello");
            var inputFile = open(inputPath, iomode.r, hints=IOHINT_CACHED);
            var reader = inputFile.reader();
            var startI = here.id * elementsPerLocale;
            var endI = startI+elementsPerLocale;
            dwriteln("startI = ", startI, " endI= ", endI);
            var a: [1..0] bigint;
            var i = 0;
            for line in reader.lines() {
                    // i in [startI;endI[
                    if i >= startI && i < endI {
                        a.push_back(new bigint(line, 16));
                    }
                    i +=1;
            }
            reader.close();
            inputFile.close();
            dwriteln("created array of size: ", a.size);
            forall elem in a {
                // perform some computation
                elem = elem ** power;
            }
            dwriteln("Computed.");
        }
    }

}

}

我希望语言环境可以并行执行操作,但事实并非如此。

但是,在运行代码时,每个语言环境似乎都会顺序进行处理。换句话说,LOCALE 0读取文件,进行处理,然后Locale 1读取文件并进行处理,依此类推。这可能是什么原因?

教堂赠款并发&amp;并行I/O-oserations:

i/o概述

a file 在教堂中标识基础操作系统中的文件。读取和写入文件是通过与文件关联的一个或多个频道完成的。每个 channel 使用一个缓冲区来提供对其文件的顺序读取或写入访问权限,可选地从偏移开始。

设计理由

由于通道独立运行,因此在不争夺锁的情况下,可以同时进行I/O到同一打开文件。此外,由于通道(而非文件)存储当前文件偏移,因此创建并行访问相同打开文件的程序很简单。请注意,当多个线程使用相同的文件*将其写入文件的不同区域时,由于FSEEK和FWRITE之间的竞赛条件,因此无法在C中进行这种并行访问。由于这些问题,希望执行I/O的教堂程序员需要知道如何打开文件以及创建频道。

但是,IO模块详细信息可能有助于更好地安排资源:

如有记录,

iohints 类型的默认值不确定。
...
proc open( out error: syserr, path: string = "", mode: iomode, hints: iohints = IOHINT_NONE, style: iostyle = defaultIOStyle(), url: string = "" ): file

用非默认的实验重新运行实验,而不是显式设置,其中I/O更好地反映了使用〜 IOHINT_PARALLEL 的预期的多部分处理处理。

由于for line in reader.lines() {...}临时迭代器的性质,也可能有兴趣使用 CC_S> IOHINT_CACHED IOHINT_SEQUENTIAL openreader() channel 特定仪器。

IOHINTS类型的值定义了有关文件或通道将执行的I/O的一组提示。这些提示可以由实施方法使用来选择I/O操作的优化版本。

iohints 类型是实现定义的。提供以下 iohints 常数:

  *  IOHINT_NONE       defines an empty set, which provides no hints.
  *  IOHINT_RANDOM     suggests to expect random access.
  *  IOHINT_SEQUENTIAL suggests to expect sequential access.
  *  IOHINT_CACHED     suggests that the file data is or should be cached
                       in memory, possibly all at once.
  *  IOHINT_PARALLEL   suggests to expect many channels working with this file
                       in parallel.

相关内容

  • 没有找到相关文章

最新更新