我正在使用小礼拜堂,并且正在尝试在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.