C# C语言中的并行阵列处理#

C# C语言中的并行阵列处理#,c#,arrays,C#,Arrays,我有一个921600个介于0和255之间的数字数组 我需要检查每个数字是否高于阈值 是否可以同时检查阵列的上半部分和下半部分,以减少运行时间 我的意思是,有可能并行运行以下两个for循环吗 for(int i = 0; i < 921600 / 2; i++) { if(arr[i] > 240) counter++; } for(int j = 921600 / 2; j < 921600; j++) { if(arr[j] > 240) counte

我有一个921600个介于0和255之间的数字数组

我需要检查每个数字是否高于阈值

是否可以同时检查阵列的上半部分和下半部分,以减少运行时间

我的意思是,有可能并行运行以下两个for循环吗

for(int i = 0; i < 921600 / 2; i++)
{
    if(arr[i] > 240) counter++;
}

for(int j = 921600 / 2; j < 921600; j++)
{
    if(arr[j] > 240) counter++;
}
for(int i=0;i<921600/2;i++)
{
if(arr[i]>240)计数器++;
}
对于(int j=921600/2;j<921600;j++)
{
如果(arr[j]>240)计数器++;
}
提前谢谢你

我建议为此使用并行Linq(PLinq)


你所要求的是严格可能的,如下所示

int counter = 0;
var tasks = new List<Task>();
var arr = Enumerable.Range(0, 921600).ToArray();
tasks.Add(Task.Factory.StartNew(() =>
{
    for (int i = 0; i < 921600 / 2; i++)
    {
        if (arr[i] > 240) counter++;
    }
}));
tasks.Add(Task.Factory.StartNew(() =>
{
    for (int j = 921600 / 2; j < 921600; j++)
    {
        if (arr[j] > 240) counter++;
    }
}));
Task.WaitAll(tasks.ToArray());
这需要0.031s,这比我们的锁定代码快,并且仍然返回正确的答案,但是删除AsParallel调用会使其以0.024s的速度运行。并行运行一段代码会带来管理线程的开销。有时,性能的提高超过了这一点,但令人惊讶的是,在很大一部分时间里,它并没有


这个故事的寓意是,始终针对任何代码的实现运行一些预期数据的度量/计时,以检查是否确实存在性能优势。

在谷歌搜索并行概念时,遇到了您的查询。下面的小技巧可能对你有帮助

int n=921600/2;
for(int i=0; i<n; i++)
{
 if(arr[i]>240) counter ++;
 if(arr[n + i] > 240) counter ++;
}
int n=921600/2;
对于(inti=0;i240)计数器++;
如果(arr[n+i]>240)计数器++;
}

您是否尝试过使用
Parallel.For
?它不一定一分为二,但我认为根据系统的不同,你会得到很好的提升。我会跳过前半部分/后半部分的内容。。。它一事无成。使用Parallel。如果要从不同线程递增
计数器
,请确保使用类似的方法正确执行。Parallel的问题是,应该成批执行,而不是按元素执行。这听起来不错,但与单线程版本相比可能会非常慢。”调用“线程池线程将比比较本身花费更多的成本”。@Jeroen van Langen:这就是为什么我在
.aspallel()
:simple
Count
上加了注释的原因。简单的
计数不适合并行执行。当我们必须决定是否并行计算时,PLinq非常方便——只需添加/注释一行即可。
int counter = 0;
var tasks = new List<Task>();
var arr = Enumerable.Range(0, 921600).ToArray();
var locker = new Object();
tasks.Add(Task.Factory.StartNew(() =>
{
    for (int i = 0; i < 921600 / 2; i++)
    {
        if (arr[i] > 240)
            lock (locker)
                counter++;
    }
}));
tasks.Add(Task.Factory.StartNew(() =>
{
    for (int j = 921600 / 2; j < 921600; j++)
    {
        if (arr[j] > 240)
            lock (locker)
                counter++;
    }
}));
Task.WaitAll(tasks.ToArray());
Enumerable.Range(0, 921600).AsParallel().Count(x=>x>240);
int n=921600/2;
for(int i=0; i<n; i++)
{
 if(arr[i]>240) counter ++;
 if(arr[n + i] > 240) counter ++;
}