Извлечь класс массива DSI из экземпляра массива dmapped?

Я выполняю некоторые тесты производительности в пользовательской иерархии распределения, и мне нужно получить доступ к классу массива, который поддерживает сопоставленный массив. Я могу получить доступ к резервному домену через array.domain, но для класса резервного массива, похоже, ничего нет.

Например, как извлечь BlockArr/LocBlockArr из распределенного массива Block A в следующем коде:

const Space = {1..8, 1..8};
const D: domain(2) dmapped Block(boundingBox=Space) = Space;
var A: [D] int;
var A_BlockArr_obj : BockArr = A.???

person memorableusername    schedule 16.01.2018    source источник


Ответы (1)


Допустим, вы хотели получить доступ к некоторому методу или полю из класса резервного массива. В Chapel 1.16 можно написать:

var A_obj = A._value;
A_obj.foo();
writeln(A_obj.myField);

Метод _value возвращает класс резервного массива (или приватизированную копию, если вы включили приватизацию). Тот же метод можно вызывать для доменов и дистрибутивов. Обратите внимание, что это намеренно недокументировано и может измениться в будущих выпусках.

В Chapel 1.17 (который будет выпущен в апреле 2018 года) вызовы методов и доступ к полям в массивах, доменах и дистрибутивах теперь перенаправляются в вспомогательный класс, поэтому вместо этого вы можете написать:

A.foo();
writeln(A.myField);

Эти вызовы методов и доступ к полям будут вызываться в приватизированном экземпляре класса, если это возможно.

person benharsh    schedule 16.01.2018
comment
Обратите внимание: если вы работаете с основной веткой на GitHub, вы уже можете использовать эту возможность, чтобы не использовать функцию _value сегодня. - person Brad; 16.01.2018