C# 使用Parallel.For重新实现循环

C# 使用Parallel.For重新实现循环,c#,parallel.for,C#,Parallel.for,如何使用Parallel.For重新实现下面的循环 for (int i = 0; i < data.Length; ++i) { int cluster = clustering[i]; for (int j = 0; j < data[i].Length; ++j) means[cluster][j] += data[i][j]; // accumulate sum } for(int i=0;i

如何使用Parallel.For重新实现下面的循环

for (int i = 0; i < data.Length; ++i)
  {
      int cluster = clustering[i];
      for (int j = 0; j < data[i].Length; ++j)
          means[cluster][j] += data[i][j]; // accumulate sum
  }
for(int i=0;i

获得更好的性能和更快的速度是我们的目标。

您基本上可以更换外环。但是,在设置多个线程的值时,需要注意设置:

Parallel.For(0, data.Length, i => 
{
  int cluster = clustering[i];
  for (int j = 0; j < data[i].Length; ++j)
      Interlocked.Add(ref means[cluster][j], data[i][j]); 
});
Parallel.For(0,data.Length,i=>
{
int cluster=clustering[i];
对于(int j=0;j

但是,这可能不会运行得更快,实际上可能会运行得更慢,因为您可以很容易地介绍,因为所有内容都是从同一个阵列读取和写入的。

您基本上可以只替换外部循环。但是,在设置多个线程的值时,需要注意设置:

Parallel.For(0, data.Length, i => 
{
  int cluster = clustering[i];
  for (int j = 0; j < data[i].Length; ++j)
      Interlocked.Add(ref means[cluster][j], data[i][j]); 
});
Parallel.For(0,data.Length,i=>
{
int cluster=clustering[i];
对于(int j=0;j

但是,这可能不会运行得更快,实际上可能会运行得更慢,因为您可以很容易地介绍,因为所有内容都是从同一个阵列读取和写入的。

您基本上可以只替换外部循环。但是,在设置多个线程的值时,需要注意设置:

Parallel.For(0, data.Length, i => 
{
  int cluster = clustering[i];
  for (int j = 0; j < data[i].Length; ++j)
      Interlocked.Add(ref means[cluster][j], data[i][j]); 
});
Parallel.For(0,data.Length,i=>
{
int cluster=clustering[i];
对于(int j=0;j

但是,这可能不会运行得更快,实际上可能会运行得更慢,因为您可以很容易地介绍,因为所有内容都是从同一个阵列读取和写入的。

您基本上可以只替换外部循环。但是,在设置多个线程的值时,需要注意设置:

Parallel.For(0, data.Length, i => 
{
  int cluster = clustering[i];
  for (int j = 0; j < data[i].Length; ++j)
      Interlocked.Add(ref means[cluster][j], data[i][j]); 
});
Parallel.For(0,data.Length,i=>
{
int cluster=clustering[i];
对于(int j=0;j


但是,这可能不会运行得更快,实际上可能会运行得更慢,正如您很容易介绍的那样,因为所有内容都是从同一个阵列读取和写入的。

我们不会直接为您完成工作。您需要向我们展示您已经尝试过的内容。进行谷歌搜索并学习如何使用并行。ForEach您的阵列有多大?你真的需要并行性吗?(加法是最便宜的指令之一)这与Parallel.ForEach循环无关。data.Length约为一百万。我们在这里不完全为您做任何工作。您需要向我们展示您已经尝试过的内容。进行谷歌搜索并学习如何使用并行。ForEach您的阵列有多大?你真的需要并行性吗?(加法是最便宜的指令之一)这与Parallel.ForEach循环无关。data.Length约为一百万。我们在这里不完全为您做任何工作。您需要向我们展示您已经尝试过的内容。进行谷歌搜索并学习如何使用并行。ForEach您的阵列有多大?你真的需要并行性吗?(加法是最便宜的指令之一)这与Parallel.ForEach循环无关。data.Length约为一百万。我们在这里不完全为您做任何工作。您需要向我们展示您已经尝试过的内容。进行谷歌搜索并学习如何使用并行。ForEach您的阵列有多大?你真的需要并行性吗?(加法是最便宜的指令之一)这与Parallel.ForEach循环无关。data.Length约为一百万。谢谢;Add方法重载不支持双精度类型,因为我的名为“data”的数组是双精度的。我阅读了本例中的相关文章,但我不清楚如何准确地重写建议的循环。这个循环是我算法中的瓶颈之一,因为我有兴趣使用并行来管理它以提高速度。考虑到错误共享和缓存,有什么更好的解决方案?@Araz Without interlocked.add,您需要执行其他形式的同步(可能使用锁定)。也许有必要重新考虑算法的设计,将工作分开,以便更容易地并行化;Add方法重载不支持双精度类型,因为我的名为“data”的数组是双精度的。我阅读了本例中的相关文章,但我不清楚如何准确地重写建议的循环。这个循环是我算法中的瓶颈之一,因为我有兴趣使用并行来管理它以提高速度。考虑到错误共享和缓存,有什么更好的解决方案?@Araz Without interlocked.add,您需要执行其他形式的同步(可能使用锁定)。也许有必要重新考虑算法的设计,将工作分开,以便更容易地并行化;Add方法重载不支持双精度类型,因为我的名为“data”的数组是双精度的。我阅读了本例中的相关文章,但我不清楚如何准确地重写建议的循环。这个循环是我算法中的瓶颈之一,因为我有兴趣使用并行来管理它以提高速度。考虑到错误共享和缓存,有什么更好的解决方案?@Araz Without interlocked.add,您需要执行其他形式的同步(可能使用锁定)。也许有必要重新考虑算法的设计,将工作分开,以便更容易地并行化;Add方法重载不支持双精度类型,因为我的名为“data”的数组是双精度的。我阅读了本例中的相关文章,但我不清楚如何准确地重写建议的循环。这个循环是我算法中的瓶颈之一,因为我有兴趣使用并行来管理它以提高速度。考虑什么更好的解决方案