'

Средства распараллеливания в Java 1.7 (jsr166y...)

Понравилась презентация – покажи это...





Слайд 0

Средства распараллеливания в Java 1.7 (jsr166y...) Михаил Пономаренко, Tech Lead компании Sigma Ukraine


Слайд 1

немного истории до java 1.5 были wait notify synchonized в 1.5 - jsr166 java.util.concurrent Future, ThreadExecutor ConcurrentMap - асинхронные итераторы


Слайд 2

немного истории в 1.6 - jsr166x  BlockingDeque ConcurrentNavigableMap, NavigableMap в 1.7 - jsr166y ForkJoinPool Phaser ParallelArray (jsr166y extra)


Слайд 3

java.util.concurrent.Phaser


Слайд 4

java.util.concurrent.Phaser void startTasks(List<Runnable> tasks, final int iterations) { final Phaser phaser = new Phaser() { protected boolean onAdvance(int phase, int registeredParties) { return phase >= iterations || registeredParties == 0; } }; phaser.register(); for (final Runnable task : tasks) { phaser.register(); new Thread() { public void run() { do { task.run(); phaser.arriveAndAwaitAdvance(); } while (!phaser.isTerminated()); } }.start(); } phaser.arriveAndDeregister(); // deregister self, don't wait }


Слайд 5

Fork Join – рекурсивная декомпозиция    если задача маленькая - посчитать если большая разбить и посчитать рекурсивно дробить Возможно дробить считать все вместе


Слайд 6

JDK7 дает возможность дробить мелко Минимум взаимодействия Fork Join – рекурсивная декомпозиция   


Слайд 7

ForkJoin задача 1 2 3 ответ 4


Слайд 8

Детали реализации дополнительной сихронизации не требуется старые разбиения "больше“ Поэтому:  У каждого потока свой дек задачь поток выполнения берет задачу из дека задача добавляет подзадачи в дэк или производит вычисления если задачи кончилисть - "украсть" задачу у другого потока


Слайд 9

Детали реализации готово 100 100 готово готово Готово 50 50


Слайд 10

ForkJoinTask<V> protected abstract boolean exec() ForkJoinTask<V> fork() Не ждет public final V join() То же но без исключений public static void invokeAll(ForkJoinTask<?>... tasks)) Invoke = fork(); join();


Слайд 11

RecursiveAction extends ForkJoinTask<Void> protected void compute() Посчитать Поделить Вызвать invokeAll Сделать join Нужно что то сделать, но нет возвращаемого значения RecursiveTask – есть возаращаемое значение – его вернет join


Слайд 12

Примеры Doug Lea


Слайд 13

Результаты Doug Lea Быстрее раз процессоров


Слайд 14

Пример 2^28 произвольных чисел double (2 гб) ForkJoinPool pool = new ForkJoinPool(p); SinCosHuge task = new SinCosHuge(randomData); pool.execute(task); Double rz = task.join();


Слайд 15

Пример import java.util.concurrent.RecursiveTask; public class SinCosHuge extends RecursiveTask<Double> { … protected Double compute() { if (to - from < threshold) { double rz = 0; for (int i = from; i < to; i++) { rz += Math.sin(data[i]) + Math.atan(data[i]); } return rz; } else { int i = (from + to) / 2; SinCosHuge right = new SinCosHuge(data, from, i); SinCosHuge left = new SinCosHuge(data, i, to); invokeAll(left,right); return right.join() + left.join(); } } …


Слайд 16

Мои измерения Загрузка процессора 100% температура


Слайд 17

Мои измерения, время выполнения. потоков время


Слайд 18

потоков Во сколько раз медленнее минус один


Слайд 19

Мои измерения – относительно самого быстрого потоков Относительная разница в скорости. %


Слайд 20

А если по старому? ThreadExecutorPool Result add(double) waitDone fork ThreadPoolExecutor tpe = new ThreadPoolExecutor(p, p, 10,SECONDS, workQueue); Result rz = new Result(); tpe.submit(new SinCosHugePool(randomData, tpe, rz)); rz.waitDone();


Слайд 21

Runnable.run if (to - from < treshold) { double rz = 0; for (int i = from; i < to; i++) { rz += Math.sin(data[i]) + Math.atan(data[i]); } result.add(rz); } else { int i = (from + to) / 2; SinCosHugePool right = new SinCosHugePool(data, from, i, executor,result); SinCosHugePool left = new SinCosHugePool(data, i, to, executor,result); result.fork(); executor.execute(left); executor.execute(right); }


Слайд 22

А если по старому? потоков Во сколько раз медленнее минус один


Слайд 23

А если по старому Относительная разница в скорости. % Ниже = лучше потоков


Слайд 24

ParallelArray Судя по всему НЕ попадет в JDK 1.7, но исходники доступны MapReduce в пределах одной машины


Слайд 25

Пример IBM ParallelArray<Student> students = new ParallelArray<Student>(fjPool, data); double bestGpa = students.withFilter(isSenior).withMapping(selectGpa).max(); public class Student { String name; int graduationYear; double gpa; } static final Ops.Predicate<Student> isSenior = new Ops.Predicate<Student>() { public boolean op(Student s) { return s.graduationYear == Student.THIS_YEAR; } }; static final Ops.ObjectToDouble<Student> selectGpa = new Ops. ObjectToDouble<Student>() { public double op(Student student) { return student.gpa; } };


Слайд 26

Мой пример new long[16384 * 16384/8] - 1 гб рабочей памяти, double[16384 * 16384/2] – 6гб рабочей import jsr166y.ForkJoinPool; import extra166y.ParallelLongArray; ….. long[] randomData = new long[16384 * 16384/8]; ForkJoinPool pool = new ForkJoinPool(p); ParallelLongArray arr = ParallelLongArray.createUsingHandoff(randomData, pool); int uniqueCount = arr.allUniqueElements().size(); ParallelLongArray.SummaryStatistics summary = arr.summary();


Слайд 27

Результаты потоков Во сколько раз медленнее


Слайд 28

Откуда начать Concurrency JSR-166 Interest Site: http://g.oswego.edu/dl/concurrency-interest/


×

HTML:





Ссылка: