2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2, 3  След.
 
 Распараллеливание для многоядерных процессоров
Сообщение10.05.2012, 10:13 
Заблокирован
Аватара пользователя


22/03/08

7154
Саратов
Сначала позволю себе привести две цитаты форумчан из других тем.

Профессор Снэйп в сообщении #556070 писал(а):
Если Вы не умеете программировать ни на чём, кроме Бейсика, и не знаете, как распараллеливать процессы вычисления, то это не значит, что другие тоже не знают и не умеют. А если грамотно запрограммировать перебор, то $15!$ вариантов вполне по силам обычной современной персоналке, и она всё сделает за вполне приемлемое время.

[сообщение обращено ко мне]

svb в сообщении #565465 писал(а):
Сейчас моя программа не использует многоядерность, т.е. можно только запускать несколько программ по количеству ядер процессора без увеличения времени работы.

(из темы «Магические квадраты»)

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

Для меня это важный вопрос. Сейчас решаю одну задачу по магическим квадратам (см. в теме "Магические квадраты", стр. 155-159). Мои коллеги svb и alexBlack сделали неплохие программы для решения этой задачи, однако время выполнения программ очень и очень большое.
Автор одной из программ пишет (см. цитату), что нe использует в программе многоядерность процессора. А если попробовать использовать...

Исходники обеих программ выложены авторами на их сайтах.
http://alex-black.ru/article.php?content=121
http://svb.hut.ru/ALG/mag6.htm

Кто может попробовать?

 Профиль  
                  
 
 Re: Распараллеливание для многоядерных процессоров
Сообщение10.05.2012, 10:24 
Заслуженный участник


28/04/09
1883
Насколько я понимаю, у Вас обычно много наборов входных данных для проверки. Поэтому вы можете просто запускать одновременно 2 (или более, если ядер у Вас больше) экземпляра одной программы, не использующей многоядерность, с разными наборами входных данных, а операционная система сама справится с раскидыванием запущенных задач по ядрам. Разумеется, при этом стоит позаботиться о том, чтобы эти экземпляры программы не обращались к одним и тем же файлам для чтения/записи.

 Профиль  
                  
 
 Re: Распараллеливание для многоядерных процессоров
Сообщение10.05.2012, 10:31 
Заблокирован
Аватара пользователя


22/03/08

7154
Саратов
Этот ответ я ожидала.
Так я делаю, но... Это не совсем то.

Я не могу запустить две разные программы для проверки одного и того же числа! Понимаете? Я могу это сделать только для проверки разных чисел, что и делаю. Однако мне надо убыстрить выполнение одной и той же программы! А этого как раз и можно достичь путём распараллеливания. Если я правильно понимаю это самое распараллеливание, то здесь оно вполне возможно (идёт перебор, несколько вложенных циклов).

Например, сейчас у меня работает программа alexBlack, она проверяет число 2911 (подробно см. в теме "Магические квадраты"). Если я запущу вторую программу для проверки этого же числа, это ничего не даст, программа будет выполняться точно так же, никакого убыстрения не будет. А программа выполняется вот уже вторые сутки и конца не видно. Аналогично для следующих чисел массива, а в массиве 64 числа.

Или такой пример: проверяется массив из 36 чисел, тут уже ничего нельзя ни добавить, ни прибавить, чисел ровно столько, сколько можно поместить в пандиагональный квадрат 6-го порядка.
svb проверил такой массив (для константы 1494) по своей программе, проверка шла около 5 часов. Это очень долго для массива из 36 чисел! А вот если распараллелить на 4 ядра эту проверку...

 Профиль  
                  
 
 Re: Распараллеливание для многоядерных процессоров
Сообщение10.05.2012, 17:50 
Аватара пользователя


31/10/08
1242
Nataly-Mak
Кластер или просто многоядерная система?
Какой процессор?
Ускорение во сколько раз хотите получить?
Видео карту не хотите использовать? Если есть, то опять таки какая?

 Профиль  
                  
 
 Re: Распараллеливание для многоядерных процессоров
Сообщение10.05.2012, 22:01 
Заблокирован
Аватара пользователя


22/03/08

7154
Саратов
Pavia
извините мою неграмотность в этих вопросах :-)

Компьютер у меня с двухядерным процессором. Процессор AMD E2-3200, ОС Windows 7 HB 64 bit.

Использовать видеокарту... Это как?
Про видеокарту у меня написано: видеокарта AMD Radeon ТМ HD6370D 512 МБ.

А что, можно увеличить время выполнения в несколько раз (всего при двух ядрах процессора)?

 Профиль  
                  
 
 Re: Распараллеливание для многоядерных процессоров
Сообщение10.05.2012, 22:49 
Заслуженный участник


09/09/10
3729
Сейчас при распаралелливании самое важное — это правильно организовать работу с памятью. Почему? Потому что процессоры нынче работают гораздо быстрее, чем память. Простой пример: перемножение двух матриц, в одном случае вторая матрица записана по строкам, в другом — по столбцам, сами алгоритмы и там и там "лобовые", без оптимизаций типа блоковых умножений. Так вот, разница в производительности — что-то около десяти раз. Именно за счет того, что процессор вынужден ждать, пока данные из памяти не будут загружены в его кэш и далее в регистры.

Видеокарта — это очень мощное вычислительное средство, заточенное как раз под векторные и матричные вычисления. Там своя внутренняя архитектура, аппаратная многопоточность и прочее.

Если вы пишете на С/С++ — советую попробовать OpenMP, он очень прост. Грубо говоря, перед началом работы указываете, какие данные shared, какие — private, перед циклами for пишете #pragma omp for и... и все. Оно само все распараллелит.

 Профиль  
                  
 
 Re: Распараллеливание для многоядерных процессоров
Сообщение11.05.2012, 18:55 
Аватара пользователя


31/10/08
1242
Nataly-Mak
У меня тоже знаний немного.
Первое что скажу различают 3 уровня распараллеливания.
1) Между компьютерами
2) Между ядрами
3) параллелизм на уровне команд.

Для каждого уровня применяют свои инструменты.

1) Между компьютерами. Пожалуй самый простой способ параллельной обработки данных. Допустим у вас есть компьютерный класс объединенной сетью. Вы просто копируете на компьютеры данные и свою программу и запускаете на исполнение. После получаете результат. Для планирования таких работ существует море программ. Если вы сроете кластер в интернете. То тут ещё приходиться решать задачи защиты данных и системы. А также то, что компьютеры в интернете разные.
2) Параллелизм между ядрами. В компьютере много вычислительных блоков самые крупные это центральный процессор (ЦП/CPU) и графический процессор (ГП/GPU). Каждый процессор содержит один или несколько ядер. Ядро можно рассматривать, как отдельное устройство на котором можно запустить свой поток команд. Обычно не разделяют мультипроцессорный и мультиядерность.

Отличие наличие общей шины для доступа к общей памяти.
Тут можно выделить два вида систем SMP и NUMA.
Симметричное мультипроцессирование (англ. Symmetric Multiprocessing, сокращённо SMP) — архитектура многопроцессорных компьютеров, в которой два и реже более двух одинаковых процессоров подключаются к общей памяти. При доступе к общей памяти вся шина блокируется по этому одновременное чтение или запись не возможна.

NUMA (Non-Uniform Memory Access — «неравномерный доступ к памяти» или Non-Uniform Memory Architecture — «Архитектура с неравномерной памятью».
Архитектура в которой доступ к разным участкам памяти имеет разную скорость. Это связанно с умным распределением памяти, когда доступ к своей памяти идет без блокировки, а доступ к общей с блокировкой.

Если рассматривать ЦП. То для распараллеливания, кода обычно решается написанием паралельного кода для одного ядра и созданием нескольких потоков. Обычно есть такой код. Это решается на уровне языка.
CreatThead(Thead);
Thead.Do(function);
function - подпрограмма которая будет выполняться в нескольких потоках.
Это самое примитивное. Есть более расширенные вещи такое как OpenMP который облегчает написание.
Сложного ничего нет. Только надо потренироваться чтобы научиться мыслить параллельно.
Но заботиться о доступе к памяти и блокировках приходится программисту.


ГП(GPU) мощное вычислительное устройство. Современные ГП гораздо производительнее чем ЦП. Поэтому его интересно задействовать для вычислений. Ещё более интересно запустить один код одновременно на CPU и GPU. Для этих целей используют CUDA и ATIStreem и др.
CUDA разработка NVIDIA, а ATIStreem разработка ATI. Так что запуск одинакового кода на картах разных производителей затруднителен. Требуется переписывать. Правда я не в курсе последних новшеств.


3) параллелизм на уровне команд.
Современные процессоры имеют мультискалярную архитектуру. Каждое ядро обычно имеет несколько АЛУ (Арифме́тико-логи́ческое устро́йство). При определённой организации данных и команд ядро может параллельно исполнять несколько команд. Ещё есть такое понятие как SIMD.
SIMD (англ. single instruction, multiple data — одна команда, множество данных, ОКМД) — принцип компьютерных вычислений, позволяющий обеспечить параллелизм на уровне данных. Когда данные сгруппированы в двойки, четверки, восьмёрки. И одна команда выполняет одну операцию над данными, задействуя 2,4,8 АЛУ.


Цитата:
А что, можно увеличить время выполнения в несколько раз (всего при двух ядрах процессора)?
Да можно. Есть известная формула закон Амдаля если процент издержек мал, то прирост можно получить большой. В виду того что обычно центральный процессор содержит 2-4 ядра, а каждое ядро 8,16,... АЛУ. Графический процессор имеет десятки, сотни, а топовые тысячи АЛУ. В GPU АЛУ обычно условно группируются на 4 реже 8 ядер.


Что касается распараллеливания кода. То неплохая вводная лекция.
http://www.intuit.ru/department/superco ... seraspp/2/
Также теорию распараллеливания появилась во второй версии книги Дракона(Альфред Ахо,Рави Сети,Джеффри Ульман Компиляторы).

 Профиль  
                  
 
 Re: Распараллеливание для многоядерных процессоров
Сообщение11.05.2012, 19:43 
Заблокирован
Аватара пользователя


22/03/08

7154
Саратов
Joker_vD, Pavia
большое спасибо за информацию.
Только вряд ли я смогу в этом разобраться :-(
Нужна практическая помощь по распараллеливанию уже имеющегося кода.

 Профиль  
                  
 
 Re: Распараллеливание для многоядерных процессоров
Сообщение11.05.2012, 20:19 
Аватара пользователя


31/10/08
1242
Nataly-Mak
Если знаете паскаль. И собираетесь писать на фри паскале/Delphi.

Небольшая справка по потокам в дельфи. Её достаточно для быстрого старта.
http://www.delphimaster.ru/articles/panov/index.html
Более детальная теория.
http://www.delphimaster.ru/articles/book/Chap11.pdf

Если решите писать на Си то советую читать про OpenMP или про пул потоков в Boost.

 Профиль  
                  
 
 Re: Распараллеливание для многоядерных процессоров
Сообщение12.05.2012, 05:57 
Заблокирован
Аватара пользователя


22/03/08

7154
Саратов
Pavia в сообщении #569833 писал(а):
Если знаете паскаль. И собираетесь писать на фри паскале/Delphi.

Увы! Сейчас не знаю. Очень давно, когда работала, Паскаль знала и писала на нём программы.
Теперь, после многолетнего перерыва, знаю только Бейсик :-) (см. самую перву цитату)
Пишу на QBASIC. Коллега svb нашёл для меня очень хороший компилятор pb5 (до того работала с интерпретатором).
Написала под этот компилятор десятки программ построения разных магических квадратов, ничего, нормально строятся квадраты :-)

Сейчас меня интересует такой вопрос. Вот есть готовый код программы построения пандиагонального квадрата 6-го порядка, я дала ссылку на страницу, где автор выложил исходники, там так и написано "Исходники. Windows/Delphi". Как я понимаю, программа написана на Delphi.
Вот код программы (если я правильно поняла):

(Оффтоп)

unit uCommon;
interface

// Используемые типы данных
const mx = 43;
type
PNumbers = ^TNumbers;
TNumbers = array [0..mx*mx-1] of int64;
TMatrix = array [0..mx-1, 0..mx-1] of int64;

type
TAInteger = array of integer;

procedure ViewSquare(k:integer; ms:TMatrix; S:int64; p:boolean=false; a:boolean=false); overload;
procedure ViewSquare(var F:TextFile; k:integer; ms:TMatrix; S:int64; p:boolean=false; a:boolean=false); overload;
procedure ViewNumbers(k:integer; S:int64; A:TNumbers);
procedure ViewMatrix(k:integer; A:TNumbers);

function GetCnk(n, k:integer):int64;
procedure SetA(var A:TNumbers; b:array of int64);
procedure SetM(n:integer; var M:TMatrix; b:array of int64); overload;
procedure SetM(n:integer; var M:TMatrix; b:array of integer); overload;
function toMatrix(n:integer; A:TNumbers):TMatrix;
function CheckMS(n:integer; m:TMatrix; var S:int64; var p, a:boolean):boolean;
procedure ToMatrixRosser(n:integer; A:TNumbers; var M:TMatrix);
function isMagic(n:integer; M:TMatrix; var S:int64; var p:boolean):boolean;
function isPMagic(n:integer; M:TMatrix; S:int64):boolean;
procedure RosserToMatrix(n:integer; M:TMatrix; var A:TNumbers);
function isDifferent(n:integer; M:TMatrix):boolean;
procedure SetAInteger(a:array of integer; var ls:TAInteger);

implementation

procedure SetA(var A:TNumbers; b:array of int64);
var i:integer;
begin
fillchar(A, sizeof(A), 0);
for i := low(b) to high(b) do begin
A[i] := b[i];
end;
end;

procedure ViewSquare(k:integer; ms:TMatrix; S:int64; p:boolean=false; a:boolean=false);
var i, j : integer;
begin
write(k, ':[');
if p then write('p');
if a then write('a');
write(']:', S, ': ');
for i := 0 to k-1 do
for j := 0 to k-1 do begin
write(ms[i, j]);
if (i < k-1) or (j < k-1) then write(',');
end;
writeln;
end;

procedure ViewSquare(var F:TextFile; k:integer; ms:TMatrix; S:int64; p:boolean=false; a:boolean=false);
var i, j : integer;
begin
write(F, k, ':[');
if p then write(F, 'p');
if a then write(F, 'a');
write(F, ']:', S, ': ');
for i := 0 to k-1 do
for j := 0 to k-1 do begin
write(F, ms[i, j]);
if (i < k-1) or (j < k-1) then write(F, ',');
end;
writeln(F);
end;

procedure ViewNumbers(k:integer; S:int64; A:TNumbers);
var i : integer;
begin
write(k, ':');
write(S, ': ');
for i := 0 to k-1 do begin
write(A[i]);
if (i < k-1) then write(',');
end;
writeln;
end;

// Возвращает количество сочетаний из n по k
// (без учета порядка следования)
// Cnk = n!/(k!*(n-k)!)
function GetCnk(n, k:integer):int64;
var d:integer;
begin
d := n-k;
result := 1;
while n > d do begin
result := result * n;
dec(n);
end;
while k > 1 do begin
result := result div k;
dec(k);
end;
end;

function toMatrix(n:integer; A:TNumbers):TMatrix;
var i, j:integer;
begin
fillchar(result, sizeof(result), 0);
for i := 0 to n-1 do begin
for j := 0 to n-1 do begin
result[i, j] := A[i*n+j];
end;
end;
end;

// Проверка MS
function CheckMS(n:integer; m:TMatrix; var S:int64; var p, a:boolean):boolean;
var i, j, l1, l2 : integer;
S1:integer;
K:int64;
begin
p := false;
result := true;
// Считаем константу
S := 0;
for j := 0 to n-1 do S := S + m[0, j];

// Проверка по строкам
for i := 0 to n-1 do begin
S1 := 0;
for j := 0 to n-1 do S1 := S1 + m[i, j];
if S1 <> S then begin
result := false;
exit;
end;
end;

// Проверка по столбцам
for i := 0 to n-1 do begin
S1 := 0;
for j := 0 to n-1 do S1 := S1 + m[j, i];
if S1 <> S then begin
result := false;
exit;
end;
end;

// Проверка двух диагоналей
S1 := 0;
for j := 0 to n-1 do S1 := S1 + m[j,j];
if S1 <> S then begin
result := false;
exit;
end;

S1 := 0;
for j := 0 to n-1 do S1 := S1 + m[j,n-1-j];
if S1 <> S then begin
result := false;
exit;
end;

// Проверка пандиагональности
p := true;

for j := {0}1 to n-1 do begin
S1 := 0;
for i := 0 to n-1 do S1 := S1 + m[i,(j+i) mod n];
if S1 <> S then begin
p := false;
break;
end;
end;

if p then begin
for j := n{k-1} to 2*n-1 do begin
S1 := 0;
for i := 0 to n-1 do S1 := S1 + m[i,(j-i) mod n];
if S1 <> S then begin
p := false;
break;
end;
end;
end;

// Проверка ассоциативности
K := m[0,0] + m[n-1,n-1];
a := true;
l1 := (n-1) div 2;
for i := 0 to l1 do begin
l2 := (n-1) div 2;
if n mod 2 <> 0 then dec(l2);

for j := 0 to l2 do begin
S1 := m[i,j] + m[n-1-i,n-1-j];
if S1 <> K then begin
a := false;
break;
end;
end;
end;
end;

function isMagic(n:integer; M:TMatrix; var S:int64; var p:boolean):boolean;
var i,j:integer;
S1:int64;
begin
result := false;

// Вычисление суммы
S := 0;
for i := 0 to n-1 do S := S + M[0, i];

// Проверка строк
for i := 0 to n-1 do begin
S1 := 0;
for j := 0 to n-1 do begin
S1 := S1 + M[i, j];
end;
if S1 <> S then exit;
end;

// Проверка столбцов
for i := 0 to n-1 do begin
S1 := 0;
for j := 0 to n-1 do begin
S1 := S1 + M[j, i];
end;
if S1 <> S then exit;
end;

// Проверка двух диагоналей
S1 := 0;
for j := 0 to n-1 do begin
S1 := S1 + M[j, j];
end;
if S1 <> S then exit;

S1 := 0;
for j := 0 to n-1 do begin
S1 := S1 + M[j, n-1-j];
end;
if S1 <> S then exit;

result := true;

p := isPMagic(n, M, S);
end;

function isPMagic(n:integer; M:TMatrix; S:int64):boolean;
var k, i:integer;
S1 : int64;
begin
result := false;

for k := 0 to n-1 do begin
S1 := 0;
for i := 0 to n-1 do begin
S1 := S1 + M[i, (k+i) mod n];
end;
if S1 <> S then exit;
end;

for k := n to 2*n-1 do begin
S1 := 0;
for i := 0 to n-1 do begin
S1 := S1 + M[i, (k-i) mod n];
end;
if S1 <> S then exit;
end;

result := true;
end;

procedure ToMatrixRosser(n:integer; A:TNumbers; var M:TMatrix);
var i, j, k, l : integer;
begin
for i := 0 to n-1 do begin
for j := 0 to n-1 do begin
k := (3*i+2*j) mod n;
l := (2*i+j) mod n;

M[k,l] := A[i*n+j];
end;
end;
end;

procedure RosserToMatrix(n:integer; M:TMatrix; var A:TNumbers);
var i, j, k, l : integer;
begin
for i := 0 to n-1 do begin
for j := 0 to n-1 do begin
k := (3*i+2*j) mod n;
l := (2*i+j) mod n;

A[i*n+j] := M[k,l];
end;
end;
end;

procedure SetM(n:integer; var M:TMatrix; b:array of int64);
var i, j:integer;
begin
for i := 0 to n-1 do
for j := 0 to n-1 do begin
M[i,j] := b[i*n+j];
end;
end;

procedure SetM(n:integer; var M:TMatrix; b:array of integer);
var i, j:integer;
begin
for i := 0 to n-1 do
for j := 0 to n-1 do begin
M[i,j] := b[i*n+j];
end;
end;

procedure ViewMatrix(k:integer; A:TNumbers);
var i, j:integer;
begin
for i := 0 to k-1 do begin
for j := 0 to k-1 do begin
write(A[i*k+j], ' ');
end;
writeln;
end;
end;

// Проверка всех чисел матрицы
// возвращает true, если все числа различны
function isDifferent(n:integer; M:TMatrix):boolean;
var i, j, k, l, c:integer;
D:int64;
begin
result := true;

for i := 0 to n-1 do begin
for j := 0 to n-1 do begin

D := m[i, j]; c := 0;
for k := 0 to n-1 do begin
for l := 0 to n-1 do begin
if m[k, l] = D then begin
inc(c);
if c > 1 then begin
writeln(D);
result := false;
exit;
end;
end;
end;
end;
end;
end;
end;

// a -> ls
procedure SetAInteger(a:array of integer; var ls:TAInteger);
var i:integer;
begin
SetLength(ls, high(a)-low(a)+1);
for i := 0 to length(ls) - 1 do ls[i] := a[i];
end;

end.

Программа эта замечательно работает, написана она очень грамотным программистом (автор alexBlack). Беда в том, что работает она очень долго, для некоторых магических констант проверка может занимать несколько суток.

В этой программе не задействована многоядерность процессора.
Вопрос следующий: возможно ли и насколько сложно ввести в эту программу распараллеливание всего процесса вычислений?
У меня, как уже писала, всего два ядра в процессоре. У моего коллеги svb четырёхядерный процессор. У одного товарища с другого форума восьмиядерный процессор, и он готов помочь с выполнением программы, но сам распараллелить готовый код не может.

Или, может быть, чтобы использовать многоядерность, надо писать новый код? Код, который написан для одноядерного процессора, не годится, переделать его под многоядерный процессор сложно или вообще невозможно (?)
В этом весь вопрос!

 Профиль  
                  
 
 Re: Распараллеливание для многоядерных процессоров
Сообщение12.05.2012, 08:38 
Заслуженный участник
Аватара пользователя


01/08/06
2667
Уфа
Nataly-Mak писал(а):
Код, который написан для одноядерного процессора, не годится, переделать его под многоядерный процессор сложно или вообще невозможно (?)
В общем и целом — да. Если делать "по уму", нужно анализировать конкретный код, выделить места, которые съедают основное время (скорее всего, это будет один небольшой цикл, но от этого не сильно легче), смоделировать разбиение этих мест на параллельные участки, учитывая весь комплекс возможных проблем (включая саму возможность эффективного распараллеливания, оптимальный конкурентный доступ к памяти и т.п.). Возможно придётся существенно переделывать программу.

Но можно попытаться упростить задачу, "срезав углы". Как вариант: попробовать найти естественное разбиение задачи на несколько независимых подзадач, передавать номер подзадачи в программу как параметр командной строки и запустить одновременно несколько процессов (exe-файлов) с разными параметрами. Операционная система автоматически распределит ядра процессора между процессами.
Например, в случае магических квадратов можно в качестве параметра задавать число в левой верхней клетке:
MyCoolMagicSquareFinder.exe /TopLeft=13
будет рассматривать только квадраты, у которых в левом верхнем углу стоит 13.

 Профиль  
                  
 
 Re: Распараллеливание для многоядерных процессоров
Сообщение12.05.2012, 10:52 
Заблокирован
Аватара пользователя


22/03/08

7154
Саратов
worm2 в сообщении #569953 писал(а):
Как вариант: попробовать найти естественное разбиение задачи на несколько независимых подзадач, передавать номер подзадачи в программу как параметр командной строки и запустить одновременно несколько процессов (exe-файлов) с разными параметрами. Операционная система автоматически распределит ядра процессора между процессами.

По моему разумению в приведённой программе как раз возможен именно такой вариант.

В программе выполняются вложенные циклы, их, скажем, 11. Можно разбить эти вложенные циклы, например, на 4 независимых друг от друга процесса по самому внешнему циклу. Пусть у нас в программе переменная внешнего цикла изменяется от 1 до 64. Можно сделать так, чтобы было 4 независимых подзадачи: в первой переменная внешнего цикла изменяется от 1 до 16, во второй - от 17 до 32 и т.д. Все остальные вложенные циклы в каждой подзадаче выполняются одинаково, ведущей яляется переменная внешнего цикла.
Тогда параметром для каждой подзадачи будет служить интервал изменения переменной внешнего цикла.

Но возможно ли такое разбиение на независимые подзадачи в принципе?

 Профиль  
                  
 
 Re: Распараллеливание для многоядерных процессоров
Сообщение15.05.2012, 06:37 
Заблокирован
Аватара пользователя


22/03/08

7154
Саратов
Как я понимаю, распараллелить приведённый код желающих не нашлось :-)
Тогда задача попроще.
Та же самая программа (исходник выложен).
Требуется модифицировать эту программу.

Сделать нужно следующее:
в программе происходит перебор во вложенных циклах. Пусть переменная внешнего цикла I. Эта переменная изменяется в программе от 1 до n, n зависит от количества чисел в заданном массиве. Прохождение всех вложенных циклов выполняется очень и очень долго.
Сделаем так: введём в программу параметр, значение этого параметра будет определять начальное значения переменной I. Если мы хотим начать выполнение вложенных циклов не с I=1, а, например, с I=5, мы должны ввести в программу значение параметра, равное 5.

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

Это сделать можно и совсем несложно (для тех, кто знает язык). Мне такую модификацию делал итальянский коллега S. Tognon. Это была моя программа построения нетрадиционных пандиагональных квадратов 5-го порядка из заданного массива, состоящего из 25 чисел. Коллега переписал эту программу на C++ и ввёл указанную модификацию. Работать стало очень удобно, я в любой момент могла прервать программу, а потом начать её с прерванного места. Это был первый вариант моей программы. А потом я сделала программу по более эффективному алгоритму, и эта программа стала выполняться намного быстрее; необходимость в прерывании отпала сама собой.

 Профиль  
                  
 
 Re: Распараллеливание для многоядерных процессоров
Сообщение15.05.2012, 17:34 


26/01/10
959
Обождите, а почему тов. alexBlack не напишет параллельную версию? Он вполне может это сделать. Или проблема только в том, что нет мощного параллельного компьютера?

-- Вт май 15, 2012 17:35:55 --

Zealint писал(а):
Он вполне может это сделать.

Через пару недель я тоже мог бы взяться, если будет актуально и мне кто-нибудь напомнит.

 Профиль  
                  
 
 Re: Распараллеливание для многоядерных процессоров
Сообщение15.05.2012, 18:38 


02/05/10
26
В данном случае не вижу в этом (в распараллеливании) смысла. Это была попытка поиска минимальной константы для квадратов шестого порядка из чисел Смита. Была надежда что удастся проверить ряд констант (точного количества не помню). В таком случае нет разницы - запускать несколько процессов с разными константами или один процесс параллельно для одной константы. Лучше потратить время на
поиск более эффективного алгоритма. (К сожалению попытка ничем не окончилась. Во-первых сгорел старенький ноут, на котором это все считалось, а во-вторых появились другие проблемы).

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 32 ]  На страницу 1, 2, 3  След.

Модераторы: Toucan, maxal, PAV, Karan, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group