FP所宣传的特性之一是程序是“默认并行的”,这自然适用于现代的多核处理器。实际上,减少树的数量本质上是并行的。然而,我不明白它是如何映射到多线程的。考虑以下片段(伪代码):
let y = read-and-parse-a-number-from-console
let x = get-integer-from-web-service-call
let r = 5 * x - y * 4
write-r-to-file
翻译器如何确定哪些树分支应该在线程上运行?在获得x或y之后,在单独的线程上减少5 * x或y * 4表达式将是愚蠢的(即使我们从线程池中获取它),不是吗?那么,不同的函数式语言
在haskell中,假设我有以下形式的函数调用:foo a b,其中a不依赖于b,反之亦然。似乎可以自动检测到a和b可以并行计算,但在GHC中似乎并非如此。相反,需要使用像par这样的构造来表示可以并行计算的内容。
那么,为什么haskell中的并行化不能自动发生呢?或者如果它已经存在了,为什么像par这样的构造会存在?
在之后,我实际上有更复杂的代码,有三个循环:
!$omp parallel
!$omp do
do i=1,4 ! can be parallelized
...
do k=1,1000 !to be executed sequentially
...
do j=1,4 ! can be parallelized
call job(i,j)
除了i=4之外,外部循环很快就结束了。因此,我希望在最内层的循环中启动线程,但在每个i-iteration中按顺序保留k-loop。事实上,k循环遍历随机数生成器的变化状态,因此这不能并行化。
如何只折叠i和j循环?我怀
在C++标准(std::for_each)第25.2.4.2节中:
template<class InputIterator, class Function> Function
for_each(InputIterator first, InputIterator last, Function f);
效果:将f应用于范围内的每个迭代器的去引用结果[第一次,最后一次],从第一次开始并继续到最后- 1。
这是否意味着f按顺序应用于容器的元素?
如果是的话,是否违反了它?
如果不是,为什么§6.5.4中基于范围的for循环没有实现为对std::for_each的
这是在F90中实现的,但是对于任何支持OpenMP的语言,问题都是存在的。为需要用于时间积分的多个存储阵列的模拟代码构造数据的典型方式是(目前为2维):
REAL, DIMENSION(imax,jmax,n_sub_timesteps) :: vars
然后使用如下内容进行更新:
DO J = 1, jmax
DO I = 1, imax
vars(I,J,2) = func(vars(:,:,1))
END DO
END DO
根据我的经验,OpenMP实际上不会并行化这些循环,因为它认为vars不是线程安全的。但对于程序员来说,显然是这样的。
让我们假设在更实际的情况下,
我有一个函数,我最终希望并行化。
目前,我将其称为for循环。
double temp = 0;
int y = 123; // is a value set by other code
for(vector<double>::iterator i=data.begin(); i != data.end(); i++){
temp += doStuff(i, y);
}
doStuff需要知道它在列表中的位置。所以我使用I-data.begin()来计算。
接下来,我想使用stl::for_each函数。我面临的挑战是,我需要传递迭代器的地址和y的值。我看到了使用bind
我试着做一些看起来像这样的事情:
y = @parallel (min) for i in collection
f(i)
end
其中,f(i)是一个函数,它本质上是一个while循环,用于计算满足其条件所需的迭代次数。在开始时,终止条件之一是预定次数的迭代,n。但是,如果f(i)返回的值小于n,那么理想情况下,我希望用f(i)的值替换n (例如,因为我正在寻找最小的f(i),如果f(j)是m,我希望所有其他循环停止检查它们是否达到m迭代)。
我对并行计算很陌生,所以我可能误解了,但我认为我应该能够这样做:
x = Channel{Int64}(1)
put!(x,n)
y = @
我在编程方面是新手,实际上我是一名机械工程师。为了我的研究,我写了一个fortran例程来模拟一个过程。这个例程非常慢,因为要么是我写的(所以它在计算上并不完美),而且它执行了许多迭代以达到收敛,所以它需要时间。
但是我有一个6核CPU,我认为如果我能够利用所有的核心,这个例程可以比现在运行得更快。
例行公事如下:
PROGRAM my routine
INCLUDE 'dimensions_of_arrays.dim'
INCLUDE 'subroutines.sub'
INCLUDE 'subroutines2.sub'
我对matlab中的并行计算是个新手。我有一个创建分类器(SVM)的函数,我想用几个数据集来测试它。我有一个双核工作站,所以我想并行运行测试。有没有人能给我解释一下:
dataset_array={dataset1, dataset2}
matlabpool open 2
spmd
my_function(dataset(labindex));
end
和
dataset_array={dataset1, dataset2}
matlabpool open 2
parfor i:1=2
my_function(dataset(i));
end
假设我创建了一个theano函数,我如何在theano张量上,像在矩阵上一样,以元素方式并行运行操作?
# This is in theano function. Instead of for loop, I'd like to run this in parallel
c = np.asarray(shape=(2,200))
for n in range(0,20):
# some example in looping this is arbitrary and doesn't matter