在Matlab中访问三维阵列时,为什么parfor比for慢

在Matlab中访问三维阵列时,为什么parfor比for慢,matlab,multidimensional-array,parallel-processing,parfor,Matlab,Multidimensional Array,Parallel Processing,Parfor,我想让我的for循环在一个使用三维数组的程序中运行得更快,通过实验我得出结论,当我使用parfor访问三维数组时,比在for中访问要慢,而当我运行相同的代码但使用二维数组时,结果正好相反。 下面是一个小例子 **%Storing data on 3-D array with parfor** tic parfor (i=1:100) for (j=2:2134) for(x=1:1000) k(i,j,x)=100; end end end to

我想让我的for循环在一个使用三维数组的程序中运行得更快,通过实验我得出结论,当我使用parfor访问三维数组时,比在for中访问要慢,而当我运行相同的代码但使用二维数组时,结果正好相反。 下面是一个小例子

**%Storing data on 3-D array with parfor** 
tic
parfor (i=1:100)
    for (j=2:2134)
        for(x=1:1000)
    k(i,j,x)=100;
    end
    end
end
toc
Elapsed time is 319.463914 seconds.

**%storing data on 3-D array with for**
tic
for (i=1:100)
    for (j=2:2134)
        for(x=1:1000)
    k(i,j,x)=100;
    end
    end
end
toc
Elapsed time is 25.601181 seconds.

**%Storing Data in 2-D array with parfor**
tic
parfor (i=1:1000)
    for (j=2:2134)
        for(x=1:1000)
    k(i,j)=100;
    end
    end
end
toc
Elapsed time is 0.774042 seconds.

**%Storing Data in 2-D array with for**
tic
for (i=1:1000)
    for (j=2:2134)
        for(x=1:1000)
    k(i,j)=100;
    end
    end
end
toc
Elapsed time is 3.060670 seconds.
我与4名工人同时工作。
当我使用三维阵列时,为什么会发生这种情况?我如何解决它?

您没有存储相同大小的阵列,而且在三维情况下会进行大量重新分配。事实上,如果您完全按照这里的方式运行脚本,那么第一个循环就是为3d数组分配所有内存。我会尝试比较具有相同数量元素的数组和预分配。正如比克所说,您需要预分配,并且您还需要按照正确的顺序循环:在索引
k(I,j,x)
时,将循环作为外循环放置在
x
上,将循环作为内循环放置在
I
上。最后,确保将并行池配置为多线程工作,而不是默认的多进程(其中数组被复制到MATLAB的其他实例进行处理)。最后,计时时,将代码放入函数中并运行该函数。这通常会导致更快的运行时间,特别是如果您再次运行该函数。