Ateji PX - Ateji PX

Ateji PX
Парадигмаобъектно-ориентированный, пи исчисление
Печатная дисциплинасильный, статический
Лицензиякоммерческая, бесплатная 30-дневная пробная версия Premium и бесплатная версия
Интернет сайтwww.Ateji.com
Под влиянием
Ява

Ateji PX является объектно-ориентированный язык программирования расширение для Ява. Он предназначен для облегчения параллельные вычисления на многоядерные процессоры, GPU, Сетка и облако.

Ateji PX можно интегрировать с Eclipse IDE, требует минимального изучения дополнительных параллельных конструкций и не влияет на процесс разработки.

Примеры кода

Привет, мир

общественный учебный класс Привет, мир {  общественный статический пустота главный(Нить[] аргументы) {    [      || Система.из.println("Привет");      || Система.из.println("Мир");    ]  }}

Каждый || символ вводит параллельную ветвь. Запуск этой программы напечатает либо

Привет, мир

или же

WorldHello

в зависимости от того, как запланированы параллельные ветки.

Параллелизм данных

[  || (int я : множество.длина) множество[я]++;]

Количественная оценка (int я: N) создает одну параллельную ветвь для каждого значения я. Эффект этого кода заключается в увеличении всех элементов множество в параллели. Этот код эквивалентен

[  || множество[0]++;  || множество[1]++;  ...  || множество[множество.длина-1]++;]

Возможны более сложные количественные оценки. В следующем примере количественная оценка выполняется по левому верхнему треугольнику квадратной матрицы:

[|| (int я:N, int j:N, если я+j<N) матрица[я][j]++;]

Код, который выполняет аналогичную и обычно небольшую операцию над большим набором элементов, называется параллельные данные, и часто появляется в высокопроизводительных научных приложениях. Типичным представителем языков параллельных данных для экосистем C / C ++ или Fortran является OpenMP.

Функции параллелизма данных также могут быть реализованы библиотеками, использующими специальные структуры данных, такие как параллельные массивы.

Параллелизм задач

Термин «параллелизм задач» используется, когда работу можно концептуально разложить на несколько логических задач. В этом примере задачи создаются рекурсивно:

int выдумать(int п) {  если (п <= 1) возвращаться 1;  int fib1, fib2;  // рекурсивно создаем параллельные ветви  [    || fib1 = выдумать(п-1);    || fib2 = выдумать(п-2);  ]  возвращаться fib1 + fib2;}

Параллелизм задач реализован в таких языках, как Силк, и в библиотеках, подобных вилка / присоединение пара системных вызовов Unix.

Передача сообщений

У параллельных ветвей есть два способа связи; либо путем одновременного чтения и записи общих переменных, либо путем отправки явных сообщений. Операторы ! и ? соответственно отправить и получить сообщение на канале.

В этом примере две параллельные ветви взаимодействуют посредством явной передачи сообщений:

Чан<Нить> чан = новый Чан<Нить>();[  // ветвь 1 отправляет значение по каналу  || чан ! "Привет";  // ветка 2 получает значение из канала и распечатывает его  || чан ? s; Система.из.println(s);]

Поток данных

Программа называется поток данных когда вычисление инициируется и синхронизируется доступностью данных в потоке. Типичным примером является сумматор: у него два входа, один выход, и когда два входа готовы, он отправляет их сумму на выходе.

пустота сумматор(Чан<Целое число> в 1, Чан<Целое число> in2, Чан<Целое число> из) {  за(;;) {    int значение1, значение2;    [ в 1 ? значение1; || in2 ? значение2; ];    из ! значение1 + значение2;}}

Обратите внимание на параллельное чтение [ в 1 ? значение1; || in2? значение2; ]. Это означает, что два входных значения могут быть в любом порядке. Без него код может зайти в тупик, если значения поступают в неправильном порядке. Это показывает, что параллельные примитивы в языке программирования связаны не только с производительностью, но и с поведением программ.

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

[  || источник(c1); // генерирует значения на c1  || источник(c2); // генерирует значения на c2  || сумматор(c1, c2, c3);  || раковина(c3); // считываем значения из c3]

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

внешняя ссылка