Каково лучшее решение для смущающе параллельной проблемы?

Извините за неопределенный вопрос о теме, но я работаю над некоторыми академическими стандартными программами обработки видеоданных. Алгоритмы записаны в MATLAB, и в то время как он хорошо для целей разработки, он обработал видео приблизительно в 60spf, или вокруг.0166fps. Само собой разумеется, эта привычка быть достаточным для демонстраций и такого, таким образом, моя работа на лето состоит в том, чтобы преобразовать стандартную программу во что-то, что будет работать решительно быстрее.

Я переписал самую медленную часть кода для CUDA, решения Nvidia GPGPU. Однако существует также значительная часть кода, который, кажется, лучше сделан на ЦП, поскольку это относительно последовательно. Проблема, машина, которую мне дали, имеет 2 процессора Xeon с 8 логическими общими количествами ядер, и это, кажется, позор к узкому месту код GPU путем кодирования только для одноядерного. Видео процесс преобразования функционален в том каждом кадре, не зависит от других кадров, таким образом, я думал, что некоторая асинхронная очередь/поток будет лучше всего.

Здесь находится мой вопрос: каков был бы лучший способ достигнуть этого типа параллелизма с лучшим отношением усилия ускорить урожай?

Некоторыми решениями, на которые я посмотрел, является OpenMP, .net TPL и просто простой pthreads.

У меня только есть основное воздействие асинхронному программированию, таким образом, я пользовался бы библиотекой или чем-то, а не бездельничал бы со взаимными исключениями и барьерами и выстрелил бы себе в ногу многократно. Я не возражаю учиться, потому что это - одна из моих целей в течение этого лета, но в то же время параллелизм труден. Однако, если различие в скорости на самом деле очень примечательно, я готов вытащить волосы в течение пары недель.:P

Заранее спасибо.

5
задан Matt Ball 21 June 2010 в 19:43
поделиться

2 ответа

Если вашей целью является максимизация усилий для достижения отдачи, я бы порекомендовал взглянуть на TPL в .NET. Это, вероятно, самый простой способ реализовать это. В зависимости от того, что делает ваш код, вы можете либо сформировать конвейер, либо просто использовать Parallel.For (или ForEach) в каждом «кадре».

При этом, если вы хотите придерживаться собственного, неуправляемого кода, хорошим вариантом может быть новая Библиотека параллельных шаблонов Microsoft или Intel Threading Building Blocks . Оба они имеют схожую конструкцию с новым TPL, особенно для параллелизма данных, и позволяют довольно легко распараллелить это, пока "каждый кадр не зависит от других кадров" остается верным.

3
ответ дан 15 December 2019 в 00:50
поделиться

Я бы посоветовал подходить к этому поэтапно.

  1. Во-первых, докажите, что у вас есть функциональная реализация, отличная от MATLAB. Это нетривиально, и, честно говоря, я думаю, вам следует запланировать 100% циклов своего мозга на правильность, прежде чем думать о производительности.

  2. Разделите свое решение: докажите, что вы можете взять подпрограмму, которая, по вашему мнению, отделена от остальной реализации, и синтаксически изолировать ее от остального кода. Например, если вы говорили о трассировщике лучей, вы могли бы взять математику, полученную в результате одной точки обзора, которая направляет луч через один пиксель в обычную среду. Это также нетривиально, так как вам потребуется подумать о том, что на самом деле является общим (например, геометрия среды, карты текстур и т. Д.) И что является специфическим для уникальной ситуации (например, луч от глаза к пикселю). . Профилирование производительности - ваш друг.

  3. Определите синтаксис интересующих вас библиотек или фреймворков, которые потребуются для параллельного создания потоков / процессов, их запуска и объединения их результатов после завершения. Примечание: вам потребуется взаимное исключение для общих данных и т. Д. Например, в мире Java это будет java.util.concurrency .

  4. Попробуйте создать два (только два) потока, чтобы разделить вашу работу пополам. Напишите тесты, которые позволят вам измерить ваше первоначальное решение, решение для N = 2 потоков и профилировать результаты.

  5. Только тогда вам стоит даже думать о дальнейшем распараллеливании.

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

1
ответ дан 15 December 2019 в 00:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: