相关疑难解决方法(0)

为什么a*b*a在Matlab脚本中使用gpuArray时需要比('*'(a*b)')'更长的时间?

下面的代码执行操作上gpuArrays相同的操作ab在两种不同的方式.第一部分计算(a'*(a*b)')',第二部分计算a*b*a.然后验证结果是相同的.

%function test
clear
rng('default');rng(1);
a=sprand(3000,3000,0.1);
b=rand(3000,3000);
a=gpuArray(a);
b=gpuArray(b);
tic;
c1=gather(transpose(transpose(a)*transpose(a*b)));
disp(['time for (a''*(a*b)'')'': ' , num2str(toc),'s'])

clearvars -except c1

rng('default');
rng(1)
a=sprand(3000,3000,0.1);
b=rand(3000,3000);
a=gpuArray(a);
b=gpuArray(b);
tic;
c2=gather(a*b*a);
disp(['time for a*b*a: ' , num2str(toc),'s'])

disp(['error = ',num2str(max(max(abs(c1-c2))))])

%end
Run Code Online (Sandbox Code Playgroud)

但是,计算(a'*(a*b)')'速度大约是计算速度的4倍a*b*a.以下是R2018a上Nvidia K20上面脚本的输出(我尝试过不同的版本和不同的GPU,具有相似的行为).

>> test
time for (a'*(a*b)')': 0.43234s
time for a*b*a: 1.7175s
error = 2.0009e-11
Run Code Online (Sandbox Code Playgroud)

甚至更奇怪的是,如果上述脚本的第一行和最后一行是未注释的(它变成一个函数),则两个取较长的时间量(〜1.7S代替〜0.4秒).以下是此案例的输出:

>> test
time for (a'*(a*b)')': 1.717s
time for a*b*a: 1.7153s
error = 1.0914e-11
Run Code Online (Sandbox Code Playgroud)

我想知道是什么导致了这种行为,以及如何在matlab函数内而不是在脚本内部的较短时间内(即~0.4s而不是~1.7s)执行 …

matlab gpu matrix linear-algebra sparse-matrix

16
推荐指数
2
解决办法
277
查看次数

向工人发送数据

我正在尝试创建一个并行代码来加速处理非常大(几亿行)的数组.为了与此并行化,我将数据切成8个(我的核心数量)碎片,并尝试将每个工人送到1件.然而,看看我的RAM使用情况,似乎每个工件都发送给每个工作人员,有效地将我的RAM使用量乘以8.最小工作示例:

A = 1:16;
for ii = 1:8
    data{ii} = A(2*ii-1:2*ii);
end
Run Code Online (Sandbox Code Playgroud)

现在,当我将这些数据发送给使用parfor它的工作人员时,它似乎发送了完整的单元格,而不仅仅是所需的部分:

output = cell(1,8);
parfor ii = 1:8
    output{ii} = data{ii};
end
Run Code Online (Sandbox Code Playgroud)

我实际上在parfor循环中使用了一些函数,但这说明了这种情况.MATLAB实际上是将完整的单元格发送data给每个工作人员,如果是这样,如何让它只发送所需的部分?

parallel-processing matlab parfor spmd

11
推荐指数
2
解决办法
1483
查看次数

Matlab重复矩阵乘法 - 循环与内置性能

给定矩阵A,我需要与其他n向量相乘Bi(即i=1...n).大小A可以像5000x5000,因此Bi喜欢5000x1.

如果我按以下方式评估产品:

for i=1:n
    product=A*Bi;
    % do something with product
end
Run Code Online (Sandbox Code Playgroud)

结果是比计算产品的方式(数量级)慢:

%assume that S is a matrix that contains the vectors Bi as columns, i.e. S(:,i)=Bi, then:
results=A*S;   %stores all the products in matrix form
% do something with results
Run Code Online (Sandbox Code Playgroud)

的问题是,数n矢量的Bi 可能太大而被存储在存储器中,例如n=300000,所以需要使用一个环方法,其中每个时间予评估该产品,用它,然后丢弃该载体Bi.

与直接乘法相比,为什么这种方法如此缓慢,有没有办法克服这个问题?

performance matlab matrix matrix-multiplication memory-efficient

5
推荐指数
1
解决办法
766
查看次数

尽管切片,为什么parfor缓慢?

我有一个简单的parfor循环给出如下.

% fileAddr is a cell array of (size N) of file-addresses
sIdx = nan(N,1);
eIdx = nan(N,1);
errMsg = cell(N,1);
parfor i=1:N
    [sIdx(i),eIdx(i),errMsg{i}] = myFunk(fileAddr{i});
end
Run Code Online (Sandbox Code Playgroud)

函数文件myFun()加载由给定的文件fileAddr{i},进行一些计算并返回结果.文件加载部分是最耗时的.我的机器有4个物理核心.我尝试parfor()了1,2,3和4名工人.每一次,时间消耗都在类似的范围内.我的理解是,如果不止一个工作者load()并行处理文件,程序运行速度会更快,但分析器结果会显示出来.

任何人都可以解释我在哪里犯了错误?

matlab parfor matlab-load

1
推荐指数
1
解决办法
34
查看次数

与三角数的因式分解平行

三角形数字的序列是通过将自然数相加而生成的。因此,第7 三角数将是1+2+3+4+5+6+7 = 28。前十个术语为:1, 3, 6, 10, 15, 21, 28, 36, 45, 55。前四个三角形中包含的因子是:

1: 1
3: 1, 3
6: 1, 2, 3, 6
10: 1, 2, 5, 10
Run Code Online (Sandbox Code Playgroud)

我们看到这6是第一个具有四个除数的三角形。

为了找到第一个三角数超过500的除数,我编写了以下代码:

1: 1
3: 1, 3
6: 1, 2, 3, 6
10: 1, 2, 5, 10
Run Code Online (Sandbox Code Playgroud)

我想使用parfor而不是for在外循环上加快此代码的速度。但是,我得到了错误:

错误:变量s1可能旨在作为归约变量,但实际上是未初始化的临时变量。

请参见MATLAB中的Parallel for Loops,“拟为归约变量的临时变量”。

如何并行化此代码?

parallel-processing performance matlab factors parfor

1
推荐指数
1
解决办法
77
查看次数