Как подсчитать итерации в цикле Chapel forall

Я хотел бы знать, сколько раз выполняется цикл при использовании Chapel forall. Этот код, использующий библиотеку CDO, не работает, и я уверен, что это правильно. Может ли кто-нибудь дать мне хороший пример?

var j:int = 0;
writeln("\n=== FORALL LOOP ===");
forall row in cursor {
  writeln("from: ", row['from_nm'], "\tto: ", row['to_nm']);
  j += 1;
}
writeln("Expected 10 rows, got ", j);

Ошибка

faerr.chpl:59: error: illegal lvalue in assignment
faerr.chpl:57: note: The shadow variable 'j' is constant due to forall intents in this loop

person Brian Dolan    schedule 13.02.2018    source источник


Ответы (1)


По умолчанию большинство типов переменных (кроме массивов) копируются в цикл forall, поэтому их нельзя изменить. Это делается для того, чтобы избежать условий гонки в общем случае. Если вы хотите иметь возможность изменять j в цикле forall, вам нужно использовать файл forall intent.

Все намерения определены в разделе "Параллелизм данных" спецификации языка Chapel. Поскольку этот код хочет сократить j значений задач до одного значения, вы можете использовать уменьшить намерение в цикле forall, чтобы подсчитать количество итераций:

var j:int = 0;
writeln("\n=== FORALL LOOP ===");

forall row in cursor with (+ reduce j) {
  writeln("from: ", row['from_nm'], "\tto: ", row['to_nm']);
  j += 1;
}

writeln("Expected 10 rows, got ", j);
person David Iten    schedule 13.02.2018