Что такое выполнение, запускаемое зависимостями? - PullRequest
1 голос
/ 14 июля 2020

Ниже приводится цитата Дуга Ли, доступная по адресу по этой ссылке :

Несмотря на то, что вычисления могут быть параллельными по умолчанию на уровне инструкций, в локальном режиме наблюдаемые результаты выполнения, инициируемого зависимостями, всегда эквивалентны таковым для чисто пошагового последовательного выполнения, независимо от того, действительно ли происходят какие-либо разрешенные оптимизации. Точные отношения между порядком операторов и порядком выполнения, которые поддерживают связанную семантику однопроцессорного процессора, не имеют значения и даже не могут быть обнаружены (кроме, возможно, таких инструментов, как отладчики). Для изменения этих отношений отсутствуют элементы управления программиста на уровне исходного кода.

Что он подразумевает под «запуском зависимости»?

Контекст, который может помочь:

Обычный режим применяется к синтаксису c обращений к обычным (энергонезависимым) полям объекта (как в int v = aPoint.x), а также к статике и элементам массива. Это также относится к доступу по умолчанию VarHandle get и set. Несмотря на то, что он ведет себя так же, как всегда, его свойства взаимодействуют с новыми VarHandle режимами и операциями способами, которые лучше всего объясняются в терминах быстрого обзора соответствующих аспектов конструкции процессора и компилятора.

Обычный режим расширяет иначе безымянный «локальный» режим, в котором все обращения осуществляются к локальным аргументам и переменным метода; например, код для чистых выражений и функций. Обычный режим поддерживает локальный порядок приоритета для доступа, который не обязательно должен соответствовать порядку операторов исходного кода или порядку машинных команд, и, как правило, даже не является полным (последовательным) порядком.

1 Ответ

1 голос
/ 14 июля 2020

Я попытаюсь ответить, но я так вижу. IMO, вы должны вернуть несколько слов назад:

... наблюдаемые результаты запускаемое зависимостью выполнение.

Способ, которым я видите, выполнение, инициированное зависимостью, - это то, как инструкции в вашем коде имеют «зависимости» между собой. Например:

 int xx = ...;
 int yy = ...;
 
 int getSum(){
         
     int x = xx;
     int y = yy;

     return x + y;    

 }

Не имеет значения, делает ли оптимизатор:

int y = yy;
int x = xx;

return y + x;

то есть: он переупорядочивает инструкции или даже может выполнять их параллельно:

Несмотря на то, что вычисления могут быть параллельными по умолчанию на уровне инструкций ...

всегда должно быть так:

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

Все, что вы наблюдаете, исходящее из getSum всегда будет быть x + y, независимо от того, как это было оптимизировано (например, форма SSA) или даже если все тело метода выполнялось параллельно на уровне процессора, например.

Лучший пример, который включает некоторые запускаемые зависимостями выполнения можно найти здесь ; где я пытался показать, что даже если какой-то код имеет зависимости друг от друга, оптимизатор может переупорядочить инструкции, если это действительно согласно JMM

...