Matrix multiply slices of 3d Matricies

Asked by Dan Ryan

Dan Ryan (view profile)

on 5 Feb 2013
Accepted Answer by Jill Reese

Jill Reese (view profile)

Given two 3d matricies, A and B with
size(A) = (n, m, k)
and
size(B) = (m, p, k)
perform matrix multiplications on each slice obtained by fixing the last index, yielding a matrix C with
size(C) = (n, p, k).
To clarify, we would have
C(:, :, 1) = A(:, :, 1)*B(:, :, 1), ..., C(:, :, k) = A(:, :, k)*B(:, :, k).
I need to do this with gpuArrays in the most efficient manner possible.

Jill Reese

Jill Reese (view profile)

님의 답변 9 Sep 2013
채택된 답변

If you have MATLAB R2013b, you can use the new gpuArray pagefun function like so:
C = pagefun(@mtimes, A, B);

Dan Ryan

Dan Ryan (view profile)

9 Sep 2013
Brilliant! Thanks!

James Tursa

James Tursa (view profile)

님의 답변 14 Feb 2013
James Tursa

James Tursa (view profile)

님이 편집함. 14 Feb 2013

If you are not restricted to gpuArrays you can do this:
C = mtimesx(A,B);
The MTIMESX function passes pointers to the slice data to BLAS library functions in the background, so it is pretty fast. You can find MTIMESX here:
MTIMESX is not yet multi-threaded across the third dimension (but an update is in the works). A nD matrix multiply multi-threaded on the third dimension called MMX can also be used:
C = MMX('mult', A, B);
MMX can be found here:

Dan Ryan

Dan Ryan (view profile)

14 Feb 2013
great suggestion, I will keep an eye on this project

Azzi Abdelmalek

님의 답변 5 Feb 2013
Azzi Abdelmalek

Azzi Abdelmalek (view profile)

님이 편집함. 5 Feb 2013

n=3;
m=4;
k=5;
p=2;
A=rand(n,m,k)
B=rand(m,p,k)
C=zeros(n,p,k)
for ii=1:k
C(:,:,ii)=A(:,:,ii)*B(:,:,ii)
end

Dan Ryan

Dan Ryan (view profile)

5 Feb 2013
Big slowdown... for example:
A = gpuArray.rand(1000, 100, 100, 'single');
B = gpuArray.rand(1000, 100, 'single');
C = gpuArray.zeros(1000, 100, 100, 'single');
Compare
for idx = 1:100
C(:, :, idx) = A(:, :, idx).*B;
end
with
C = bsxfun(@times, A, B);
There is about a factor of 50 slowdown with the for loop.
Azzi Abdelmalek

Azzi Abdelmalek (view profile)

5 Feb 2013
bsxfun don't work with
n=3;
m=4;
k=5;
p=2;
A=rand(n,m,k)
B=rand(m,p,k)
C = bsxfun(@times, A, B);
Jill Reese

Jill Reese (view profile)

14 Feb 2013
Dan,
Can you elaborate on the sizes of m, n , k, and p that you are interested in? It would be useful to know a ballpark number for the size of problem you want to solve. Do you have many small page sizes, a few large pages, or something else?
Thanks,
Jill