在 Arrayfun 中与 GPU 处理连接的问题。软件
Issues concatenating in Arrayfun with GPU processing. MATLAB
我在使用 GPU 处理的 MATLAB 中使用 arrayfun 时遇到问题。
我在下面简化了我的情况。
我有 4 个大矩阵(视频数据为 (x,y,t))。我将在此示例中使用随机。
A = gpuArray(rand(10,10,100));
B = gpuArray(rand(10,10,100));
C = gpuArray(rand(10,10,100));
D = gpuArray(rand(10,10,100));
我希望获取每个矩阵的每个像素;(1,1,1) 然后 (2,1,1) 等;并执行最小二乘计算(数值为示例)
X = [10 10 ; 20 20 ; 30 30 ; 40 40]\[A;B;C;D];
作为 for 循环执行此操作对我的数据来说花费的时间太长。因为我想对每个元素单独执行一个函数,所以我认为使用 GPU 是可行的方法。
为此,我创建了函数
function [x] = GPUTestFun (A,B,C,D)
X = [10 10 ; 20 20 ; 30 30 ; 40 40]\[A;B;C;D];
end
然后我用 arrayfun 调用它(我认为 matlab 不支持最小二乘法?)
[x] = arrayfun(@GPUTestFun,[A;B;C;D]);
我的理解是,这应该分别取 4 个矩阵的每个元素并执行计算。
我得到的错误:
使用 gpuArray/arrayfun 时出错
不支持数组串联。行错误:
4.
第 4 行是:
X = [10 10 ; 20 20 ; 30 30 ; 40 40]\[A;B;C;D];
很明显,问题是我在 arrayfun 中连接矩阵。我已经考虑过我的选择是什么,但似乎看不到解决方案。我考虑过在调用函数之前连接矩阵,但是 array fun 会尝试对每个元素执行该函数,现在不会对齐。我考虑过也许可以手动求解最小二乘法而不是使用 \,但是我犹豫要不要尝试这个而不先检查我是否错过了一个更简单的解决方案。
我还意识到输出 X 可能需要调整,因为单个计算会产生 2 个输出,因此可能需要将它们分开,以便我的输出与输入的大小相同。然而,这不是当前的问题。
任何帮助将不胜感激。
谢谢
乔丹
编辑:工作 CPU 代码:
A = (rand(10,10,100));
B = (rand(10,10,100));
C = (rand(10,10,100));
D = (rand(10,10,100));
[X1,X2] = arrayfun(@GPUTestFun,A,B,C,D);
函数:
function [X1,X2] = GPUTestFun (A,B,C,D)
[X] = [10 11 ; 20 8 ; 30 30 ; 40 30]\[A;B;C;D];
X1 = X(1);
X2 = X(2);
end
在这种情况下,您可以简单地将整个问题重铸为对 \
的多个右侧调用,如下所示:
%# with A,B,C,D defined as per question
AA = [10 11 ; 20 8 ; 30 30 ; 40 30];
x = [A(:)'; B(:)'; C(:)'; D(:)'];
x1x2 = AA \ x;
X1 = reshape(x1x2(1,:), size(A));
X2 = reshape(x1x2(2,:), size(A));
这将在 GPU 上运行。
我在使用 GPU 处理的 MATLAB 中使用 arrayfun 时遇到问题。 我在下面简化了我的情况。
我有 4 个大矩阵(视频数据为 (x,y,t))。我将在此示例中使用随机。
A = gpuArray(rand(10,10,100));
B = gpuArray(rand(10,10,100));
C = gpuArray(rand(10,10,100));
D = gpuArray(rand(10,10,100));
我希望获取每个矩阵的每个像素;(1,1,1) 然后 (2,1,1) 等;并执行最小二乘计算(数值为示例)
X = [10 10 ; 20 20 ; 30 30 ; 40 40]\[A;B;C;D];
作为 for 循环执行此操作对我的数据来说花费的时间太长。因为我想对每个元素单独执行一个函数,所以我认为使用 GPU 是可行的方法。
为此,我创建了函数
function [x] = GPUTestFun (A,B,C,D)
X = [10 10 ; 20 20 ; 30 30 ; 40 40]\[A;B;C;D];
end
然后我用 arrayfun 调用它(我认为 matlab 不支持最小二乘法?)
[x] = arrayfun(@GPUTestFun,[A;B;C;D]);
我的理解是,这应该分别取 4 个矩阵的每个元素并执行计算。
我得到的错误: 使用 gpuArray/arrayfun 时出错 不支持数组串联。行错误: 4.
第 4 行是:
X = [10 10 ; 20 20 ; 30 30 ; 40 40]\[A;B;C;D];
很明显,问题是我在 arrayfun 中连接矩阵。我已经考虑过我的选择是什么,但似乎看不到解决方案。我考虑过在调用函数之前连接矩阵,但是 array fun 会尝试对每个元素执行该函数,现在不会对齐。我考虑过也许可以手动求解最小二乘法而不是使用 \,但是我犹豫要不要尝试这个而不先检查我是否错过了一个更简单的解决方案。
我还意识到输出 X 可能需要调整,因为单个计算会产生 2 个输出,因此可能需要将它们分开,以便我的输出与输入的大小相同。然而,这不是当前的问题。
任何帮助将不胜感激。
谢谢 乔丹
编辑:工作 CPU 代码:
A = (rand(10,10,100));
B = (rand(10,10,100));
C = (rand(10,10,100));
D = (rand(10,10,100));
[X1,X2] = arrayfun(@GPUTestFun,A,B,C,D);
函数:
function [X1,X2] = GPUTestFun (A,B,C,D)
[X] = [10 11 ; 20 8 ; 30 30 ; 40 30]\[A;B;C;D];
X1 = X(1);
X2 = X(2);
end
在这种情况下,您可以简单地将整个问题重铸为对 \
的多个右侧调用,如下所示:
%# with A,B,C,D defined as per question
AA = [10 11 ; 20 8 ; 30 30 ; 40 30];
x = [A(:)'; B(:)'; C(:)'; D(:)'];
x1x2 = AA \ x;
X1 = reshape(x1x2(1,:), size(A));
X2 = reshape(x1x2(2,:), size(A));
这将在 GPU 上运行。