Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中并行填充数组_C_Arrays_Parallel Processing_Fill - Fatal编程技术网

如何在C中并行填充数组

如何在C中并行填充数组,c,arrays,parallel-processing,fill,C,Arrays,Parallel Processing,Fill,我需要一种算法,它可以在log(n)时间内并行地用相同的值填充一个数组(大小为n)。这意味着最简单的解决方案是for(i=0;i如果使用n个处理器运行n个线程,那么总体上仍然是O(1)*n=O(n)处理器(性能将非常糟糕) 如果您运行t线程(t=n/factor),它可能会根据阵列的大小为您提供更好的性能(如果有更多处理器,非常大的阵列可以提供良好的性能)。但关键是它仍然是O(n) 只有在基于某种条件(例如,排序数组的二进制搜索)可以跳过某些操作的情况下,才能在O(logn)中完成某些操作。要初

我需要一种算法,它可以在log(n)时间内并行地用相同的值填充一个数组(大小为n)。这意味着最简单的解决方案是
for(i=0;i如果使用n个处理器运行n个线程,那么总体上仍然是
O(1)*n=O(n)
处理器(性能将非常糟糕)

如果您运行
t
线程(
t=n/factor
),它可能会根据阵列的大小为您提供更好的性能(如果有更多处理器,非常大的阵列可以提供良好的性能)。但关键是它仍然是
O(n)


只有在基于某种条件(例如,排序数组的二进制搜索)可以跳过某些操作的情况下,才能在
O(logn)
中完成某些操作。要初始化数组中的n个元素,必须访问所有n个元素。简单地说,您想要什么是不可能的。

有多种方法可以混淆您自己,因为这是一个简单的循环

for (i = 0; i <= (SIZE / 2); i++) {
    arr[i]=10;
    arr[SIZE-(i+1)]=10;
}

for(i=0;i我将忽略其他人已经解决过的将其称为“O(logn)”的问题,而是想概述一个解决方案。如果您不熟悉,它是一个用于共享内存计算的并行框架

#pragma omp parallel for shared(T)
for(int i = 0; i < n; i++) T[i] = 10;
我们可以得出结论,解决这个问题可能只对至少16个元素、最多256个元素的数组有意义(如果这个问题对您非常重要,您可以将它推高到512,甚至1024)


移动到分布式机器是另一条oats船——收集阵列的通信成本将大大超过初始化中的并行性,因为所需的节点数量正以O(n/log(n))的速度增长。您需要在创建阵列的节点上执行所有计算。

为什么并行运行任务会得到O(logn)?您不就是得到O(n)吗.n将比您同时运行的线程数小,但您仍然需要分别填充每个线程中的每个元素。因此,如果您有z个线程,那么您将有O(n/z),这仍然是线性时间。即使你做了一些小循环展开,你仍然需要线性时间。另外,你能澄清你所说的“我在考虑依赖性”是什么意思吗?你的意思是在C中包含某种类型的库吗?请更具体一些。你不能低于线性时间,因为无论你想做什么,你都至少需要做
n
写入内存。依赖性意味着(在此上下文中)例如t[i]=t[i-1],这不能与donne并行。这就是我的意思。我还找到了解决方案(来自麻省理工学院的一门课程):你可以做:for(i=0;我觉得它看起来像O(nm)。我认为你的回答实际上有助于阐明提问者想要达到的目的。尽管我不得不同意你的观点,原来的问题想要的是不可行的。
n     #num procs
4     2
16    4
256   32
65536 4096