我知道主要發現已經很好研究,並且有很多不同的實現。我的問題是,使用提供的方法(代碼示例),我該如何去分解工作?它將運行的機器有4個四核心超線程處理器和16GB內存。我意識到可以進行一些改進,特別是在IsPrime
方法中。我也知道,一旦列表中有超過int.MaxValue
項目,就會出現問題。我不關心任何這些改進。我唯一關心的是如何分解工作。我該如何使這個主要發現者並行工作
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Prime
{
class Program
{
static List<ulong> primes = new List<ulong>() { 2 };
static void Main(string[] args)
{
ulong reportValue = 10;
for (ulong possible = 3; possible <= ulong.MaxValue; possible += 2)
{
if (possible > reportValue)
{
Console.WriteLine(String.Format("\nThere are {0} primes less than {1}.", primes.Count, reportValue));
try
{
checked
{
reportValue *= 10;
}
}
catch (OverflowException)
{
reportValue = ulong.MaxValue;
}
}
if (IsPrime(possible))
{
primes.Add(possible);
Console.Write("\r" + possible);
}
}
Console.WriteLine(primes[primes.Count - 1]);
Console.ReadLine();
}
static bool IsPrime(ulong value)
{
foreach (ulong prime in primes)
{
if (value % prime == 0) return false;
if (prime * prime > value) break;
}
return true;
}
}
}
有2個基本的方案我看:1)使用所有線程測試單數,這可能是更高的素數很大,但我真的不能想象如何實現它,或2)使用每個線程測試一個可能的素數,當下一個要測試的數大於發現的最高素數的平方時,這可能導致發現不連續的素數串並且遇到未使用的資源問題。
對我來說,感覺這兩種情況只是在構建素數列表的早期階段才具有挑戰性,但我並不完全確定。這是通過個人練習打破這種工作而完成的。
「這不值得並行化,除非你首先使用了一個好的算法。」該問題明確要求您將此實現並行化,而不是另一個主要發現算法。這種算法是否滿足一些隨意的價值衡量與如何並行化無關。 – 2010-08-14 09:11:23