Атеджи ПХ
Тема этой статьи Википедии может не соответствовать общему правилу по известности . ( апрель 2018 г. ) |
Парадигма | -ориентированное объектно исчисление Пи |
---|---|
Дисциплина набора текста | сильный , статичный |
Лицензия | коммерческая, бесплатная 30-дневная пробная версия Premium и бесплатная версия |
Веб-сайт | www.Ateji.com |
Под влиянием | |
Ява |
Ateji PX — это объектно-ориентированное расширение языка программирования для Java . Он предназначен для облегчения параллельных вычислений на многоядерных процессорах , графических процессорах , Grid и Cloud.
Ateji PX может быть интегрирован с Eclipse IDE , требует минимального изучения дополнительных параллельных конструкций и не меняет процесс разработки.
Примеры кода [ править ]
Привет, мир [ править ]
public class HelloWorld {
public static void main(String[] args) {
[
|| System.out.println("Hello");
|| System.out.println("World");
]
}
}
Каждый ||
символ представляет параллельную ветвь. Запуск этой программы выведет либо
Hello World
или
World Hello
в зависимости от того, как запланированы параллельные ветки.
Параллелизм данных [ править ]
[
|| (int i : array.length) array[i]++;
]
Количественная оценка (int i : N)
создает одну параллельную ветвь для каждого значения i
. Эффект этого кода заключается в увеличении всех элементов array
параллельно. Этот код эквивалентен
[
|| array[0]++;
|| array[1]++;
...
|| array[array.length-1]++;
]
Возможны более сложные количественные оценки. В следующем примере выполняется количественная оценка верхнего левого треугольника квадратной матрицы:
[
|| (int i:N, int j:N, if i+j<N) matrix[i][j]++;
]
Код, который выполняет аналогичную и обычно небольшую операцию с большой коллекцией элементов, называется параллелизмом данных и часто встречается в высокопроизводительных научных приложениях. Типичным представителем языков с параллельными данными для экосистем C/C++ или Fortran является OpenMP .
Функции параллелизма данных также могут быть реализованы библиотеками с использованием специальных структур данных, таких как параллельные массивы .
Параллелизм задач [ править ]
Термин «параллелизм задач» используется, когда работу можно концептуально разложить на ряд логических задач. В этом примере задачи создаются рекурсивно:
int fib(int n) {
if (n <= 1) return 1;
int fib1, fib2;
// recursively create parallel branches
[
|| fib1 = fib(n-1);
|| fib2 = fib(n-2);
]
return fib1 + fib2;
}
Параллелизм задач реализован в таких языках, как Cilk , и в библиотеках, подобных fork/join
пара системных вызовов Unix.
Передача сообщений [ править ]
Параллельные ветки имеют два способа взаимодействия; либо путем одновременного чтения и записи общих переменных, либо путем отправки явных сообщений. Операторы !
и ?
соответственно отправлять и получать сообщения по каналу.
В этом примере две параллельные ветки взаимодействуют посредством явной передачи сообщений:
Chan<String> chan = new Chan<String>();
[
// branch 1 sends a value over the channel
|| chan ! "Hello";
// branch 2 receives a value from the channel and prints it
|| chan ? s; System.out.println(s);
]
Поток данных [ править ]
Программу называют потоком данных , когда вычисления инициируются и синхронизируются наличием данных в потоке. Типичным примером является сумматор: он имеет два входа, один выход, и когда два входа готовы, он отправляет их сумму на выход.
void adder(Chan<Integer> in1, Chan<Integer> in2, Chan<Integer> out) {
for (;;) {
int value1, value2;
[ in1 ? value1; || in2 ? value2; ];
out ! value1 + value2;
}}
Обратите внимание на параллельное чтение [ in1 ? value1; || in2 ? value2; ]
. Это означает, что два входных значения могут идти в любом порядке. Без этого код может зайти в тупик, если значения поступят в неправильном порядке. Это показывает, что параллельные примитивы в языке программирования касаются не только производительности, но и поведения программ.
Сумматор сам по себе ничего не делает, так как реагирует на входные данные. Его необходимо поместить в контекст, в котором другие части передают входные значения и считывают выходные значения. Это можно выразить, объединив все части в большой параллельный блок:
[
|| source(c1); // generates values on c1
|| source(c2); // generates values on c2
|| adder(c1, c2, c3);
|| sink(c3); // read values from c3
]
Все, что можно рассматривать как комбинацию логических элементов или электрических схем, можно легко выразить таким образом как программу потока данных.