Что самый легкий путь состоит в том, чтобы параллелизировать мою программу C# через несколько ПК

Вы используете неправильную функцию для поставленной задачи.
imshow ожидает ввода массива N by M на 3 из каналов RGB изображения. Когда вы используете 2D-матрицу, функция предполагает, что это изображение в градациях серого (это похоже на репликацию его на 3 идентичные матрицы для создания этих трех каналов - если все каналы в RGB имеют одинаковые значения, вы получаете цвета в градациях серого). Вы можете использовать эту функцию вместе с картой цветов , чтобы получить цветную матрицу, но есть гораздо более удобные альтернативы.

Одной простой функцией для получения цветного представления матрицы является imagesc или ( image , если вы хотите масштабировать значения самостоятельно). Эта функция принимает значения в вашей матрице и назначает им цвет из выбранной вами цветовой карты:

A = rand(10);
figure; colormap(jet); imagesc(A);

imagesc result

Другой вариант - pcolor , который работает немного по-другому, но дает аналогичный результат. pcolor прикрепляют значения к вершинам ячеек (в противоположность центру, как это делает imagesc) и интерполируют цвет в каждой ячейке из ее вершин. Полученная цветная матрица всегда меньше в одной строке и одном столбце, потому что для определения n промежутков (ячеек в цветной матрице) требуется n + 1 точек (значений в исходной матрице) ). Вот пример:

A = rand(10);
figure; colormap(jet); pcolor(A);
shading flat

pcolor result

6
задан 8 November 2008 в 19:32
поделиться

9 ответов

Это, вероятно, невозможно.

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

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

2
ответ дан 8 December 2019 в 16:13
поделиться

... с небольшими изменениями или без изменений кода?

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

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

7
ответ дан 8 December 2019 в 16:13
поделиться

Дриада (изменение Microsoft MapReduce) адреса точно эта проблема (параллелизируют программы .NET через несколько ПК). Это находится на этапе исследования прямо сейчас. Слишком плохо еще нет никаких CTPs :-(

2
ответ дан 8 December 2019 в 16:13
поделиться

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

Самый легкий сценарий, о котором я могу думать, для приложения, какая работа может легко быть повреждена в дискретных блоках задания. Если это верно, затем Вы просто разрабатываете свое рвение на единственном блоке задания. Предоставьте своему приложению способность принять новые задания и обеспечить законченные задания. Затем создайте планировщик заданий сверху его. Этот планировщик может быть частью того же приложения (настройте одну машину, чтобы быть планировщиком и остальными как клиенты), или отдельное приложение.

Существуют другие вещи рассмотреть: Как произойдет коммуникация среди машин (файлы?, сетевые соединения?); потребность приложения смочь к report/be_queried о проценте завершенного задания?; существует потребность смочь вынудить приложение прекратить обрабатывать текущее задание?; и т.д.).

Если Вы нуждаетесь в более подробном ответе, редактируете Ваш вопрос и включаете детали о приложении, проблема, приложение решает, ожидаемое количество заданий, и т.д. Затем сообщество будет идти с более определенными ответами.

2
ответ дан 8 December 2019 в 16:13
поделиться

Вам необходимо запустить приложение в распределенной системе, Google для распределенных окон вычислений или для грид-вычислений c #.

1
ответ дан 8 December 2019 в 16:13
поделиться

Каждое предложение обрабатывается независимо, или они так или иначе объединены? Если Ваша обработка воздействует на единственное предложение за один раз, Вы не должны изменять свой код вообще. Просто выполните тот же код на каждой из Ваших машин и разделите данные (Ваш список предложений) между ними. Можно сделать это или путем установки части данных по каждой машине, или путем совместного использования базы данных и присвоения различного блока каждой машине.

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

Как всегда, чем больше подробной информации можно предоставить об определенном приложении, тем лучше, ТАКИМ ОБРАЗОМ сообщество может адаптировать наши ответы на цель.

Удача - это походит на интересный проект!

1
ответ дан 8 December 2019 в 16:13
поделиться

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

0
ответ дан 8 December 2019 в 16:13
поделиться

Существует несколько программных продуктов, которые позволяют Вам использовать основанные на товаре аппаратные средства. Каждый - Appistry. Я работаю в Appistry, и мы сделали многочисленные решения запустить приложения C# через сотни машин.

Несколько полезных ссылок: http://www.appistry.com/resource-library/index.html

Можно загрузить продукт бесплатно здесь: http://www.appistry.com/developers/

Надежда это помогает - Brett

0
ответ дан 8 December 2019 в 16:13
поделиться

Вы могли бы хотеть посмотреть на Поточно-ориентированное программирование - оно имеет Java и реализацию C#. Большинство подходов к этой проблеме включает попытку взять стандартную однопоточную программу и фигуру, которую части могут выполнить параллельно. FBP проявляет другой подход: приложение разработано от запуска с точки зрения нескольких компонентов "черного ящика", работающих асинхронно (думайте о производственном сборочном конвейере). Так как стандартная однопоточная программа действует как единственный компонент в среде FBP, очень легко расширить существующее приложение. На самом деле части существующего приложения могут часто прерываться и превращаться отдельные компоненты, если они могут работать асинхронно с остальной частью приложения (т.е. не подпрограммы). Кто-то назвал это "превращением айсберга в кубики льда").

0
ответ дан 8 December 2019 в 16:13
поделиться
Другие вопросы по тегам:

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