我正在使用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读取文件并进行处理,依此类推。可能是什么原因造成的?
答案 0 :(得分:0)
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.