Я пытаюсь написать параллельный алгоритм в три раза быстрее, чем последовательный алгоритм, который делает практически то же самое. См. Пастебин.Алгоритм суммирования для параллельной программы
Pasted:
Привет всем. Я выполняю задание для класса и делаю большую часть его, однако у меня возникают некоторые проблемы с математикой. Я пытаюсь вычислить выражение:
100000000
∑ (9999999/10000000)^i * i^2
i = 1
i идет от 1 до 10 миллионов. быстрый последовательный алгоритм Дано:
double sum = 0.0;
double fact1 = 0.9999999;
for (int i = 1; i <= 10000000; i++)
{
sum += (fact1 * i * i);
fact1 *= 0.9999999;
}
Мы должны реализовать его и убедиться, что он работает, а также время его в режиме выпуска. Я уже сделал это и работаю правильно. Затем на консоли отображается время.
DateTime t = DateTime.Now;
long saveticks = t.Ticks;
double sum = 0.0;
double fact1 = 0.9999999;
for (int i = 1; i <= 100000000; i++)
{
sum += (fact1 * i * i);
fact1 *= 0.9999999;
}
t = DateTime.Now;
Затем мы должны написать синхронизированный параллельный алгоритм, который будет бить время, и, как предполагается моделировать его после того, как в качестве примера параллельной программы. Он должен быть как минимум в 3 раза быстрее, чем последовательный алгоритм. Мы должны использовать 4 элемента обработки для параллельной программы.
Есть подсказка: «После того, как вы выясните работу, которую будет обрабатывать каждый элемент обработки, вам может понадобиться запустить обработчик с помощью временной функции Pow».
, например: «Не используйте функцию POW на каждой итерации для параллельного кода, потому что он не будет бить время» Math.pow (х, у)
Вот мой код для параллельной программы. Это делает как последовательный алгоритм, так и параллельный и раз и то, и другое.
const int numPEs = 4;
const int size = 100000000;
static double pSum;
static int numThreadsDone;
static int nextid;
static object locker1 = new object();
static object locker2 = new object();
static long psaveticks;
static DateTime pt;
static void Main(string[] args)
{
DateTime t = DateTime.Now;
long saveticks = t.Ticks;
double sum = 0.0;
double fact1 = 0.9999999;
for (int i = 1; i <= 100000000; i++)
{
sum += (fact1 * (i * i));
fact1 *= 0.9999999;
}
t = DateTime.Now;
Console.WriteLine("sequential: " + ((t.Ticks - saveticks)/100000000.0) + " seconds");
Console.WriteLine("sum is " + sum);
// time it
pt = DateTime.Now;
psaveticks = pt.Ticks;
for (int i = 0; i < numPEs; i++)
new Thread(countThreads).Start();
Console.ReadKey();
}
static void countThreads()
{
int id;
double localcount = 0;
lock (locker1)
{
id = nextid;
nextid++;
}
// assumes array is evenly divisible by the number of threads
int granularity = size/numPEs;
int start = granularity * id;
for (int i = start; i < start + granularity; i++)
localcount += (Math.Pow(0.9999999, i) * (i * i));
lock (locker2)
{
pSum += localcount;
numThreadsDone++;
if (numThreadsDone == numPEs)
{
pt = DateTime.Now;
Console.WriteLine("parallel: " + ((pt.Ticks - psaveticks)/10000000.0) + " seconds");
Console.WriteLine("parallel count is " + pSum);
}
}
}
Моя проблема заключается в том, что моя последовательная программа работает быстрее, чем параллельная. Проблема с алгоритмом, который я использую.
Может ли кто-нибудь помочь?
Итак, в чем ваш вопрос? – ElKamina
.... и ваш вопрос? Вы даже пытались написать решение, или вы хотите, чтобы кто-то просто написал эту вещь для вас? – gleng
Что мне нужно изменить в моем параллельном алгоритме? На данный момент он медленнее, чем последовательный алгоритм, и он должен быть как минимум в 3 раза быстрее. Я пробовал искать в Интернете, но не могу найти никаких других подходов, которые мне удобны в реализации. –