bigint数组的多列计算

时间:2017-12-08 14:07:41

标签: distributed bigint chapel

我正在使用Chapel,我正在尝试在多语言设置中对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.");
        }
    }


}


}

我希望locales能够并行执行操作,但事实并非如此。

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

1 个答案:

答案 0 :(得分:0)

Chapel同时授予&amp;并行I / O操作:

  

I / O概述

     

Chapel中的 file 标识底层操作系统中的文件。对文件的读取和写入是通过与文件关联的一个或多个通道完成的。每个 channel 使用缓冲区来提供对其文件的顺序读取或写入访问,可选择从偏移量开始。

     

<强> Design Rationale

     

由于通道独立运行,因此可以在不争用锁定的情况下对同一个打开文件进行并发I / O.此外,由于通道(而不是文件)存储当前文件偏移量,因此可以直接创建并行访问同一打开文件的程序。请注意,由于fseek和fwrite之间的竞争条件,当多个线程使用相同的FILE *写入文件的不同区域时,在C中无法进行此类并行访问。由于存在这些问题,希望执行I / O的Chapel程序员需要知道如何打开文件以及创建通道。

然而,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() {...} ad-hoc迭代器的性质,也可能有兴趣使用 IO 和<的强调IOHINT_CACHED意图来审核实验的吞吐量strong> 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.