В таком алгоритме одного "omp parallel for" недостаточно, т.к. есть связи между итерациями (т.е. исполнение k-ой итерации зависит от результатов выполнения предыдущих). Все процессы редактируют весь массив С, и это дело надо как-то синхронизировать, что бы они друг другу не мешали.
Например такие моменты:
Код:
if((i*d+j+1)<=n)
C[i*d+j]=T;
При параллельном исполнении нет гарантий, что сначала произойдут проходы с выполнением этого условия. Может выйти так, что поток, который будет обрабатывать i с большими значениями, выполнится раньше, чем поток с низкими значениями i. Соответственно, потом выполнится поток, который будет обрабатывать i начиная с 0, и он просто перезапишет С своими значениями без проверки на максимальность.
Переменная min, как я понимаю, объявлена как общая для всех процессов. В этом куске кода процессы будут хаотически перезаписывать переменную min:
Код:
{
min=0;
for(k=1;k<n;k++)
if(C[min]>C[k])
min=k;
if(T>C[min])
C[min]=T;
}
Т.е. один процесс начинает выполнение, доходит до какого-то k < n, находит какой-то минимум среди эл-тов 0 - k, записывает в min его номер, а в этот момент другой процесс тоже начинает выполнение этого куска и делает min = 0; первый процесс про это не знает и продолжает искать минимум в остальной части массива С (от k до n), но сравнивает его не с найденным минимумом, а с C[0].
Вобщем надо сначала продумать как разделить работу между процессами, так что бы они друг другу не мешали, а потом уже параллелить это с omp.
Если значения A и B неотрицательные, я бы просто заполнил сначала C нулями и убрал бы вообще этот if: "if((i*d+j+1)<=n)". Потом объявил бы переменную min?как общую для всех процессов, но перерасчитывал бы её только если Т оказалось больше C[min], и на время перерасчёта и добавления эл-та запрещал бы остальным процессам добавлять эл-ты в массив С и сравнивать с min.
Если я в чём-то не прав, прошу исправить, я тоже новичок в этом деле
