Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab GPU并行化效率_Matlab_Parallel Processing_Vectorization_Gpu - Fatal编程技术网

Matlab GPU并行化效率

Matlab GPU并行化效率,matlab,parallel-processing,vectorization,gpu,Matlab,Parallel Processing,Vectorization,Gpu,我最初将此任务作为一个基本的并行化问题提交,由@Divakar回答。他的工作将是这一后续行动的基础。他建议,通过将代码移植到GPU上进行计算,可以进一步提高速度。我一直在研究这一途径,并且能够将矢量化解决方案从迭代循环的15%的速度提高到50%。然而,进一步的修补并没有带来许多其他的改进。我首先担心的是,硬件功能不够强大,但在我们的团队能够证明在新硬件上花钱是合理的之前,我们希望看到当前设置的代码更高效: XGPU = gpuArray(X); YGPU = gpuArray(Y); HGPU

我最初将此任务作为一个基本的并行化问题提交,由@Divakar回答。他的工作将是这一后续行动的基础。他建议,通过将代码移植到GPU上进行计算,可以进一步提高速度。我一直在研究这一途径,并且能够将矢量化解决方案从迭代循环的15%的速度提高到50%。然而,进一步的修补并没有带来许多其他的改进。我首先担心的是,硬件功能不够强大,但在我们的团队能够证明在新硬件上花钱是合理的之前,我们希望看到当前设置的代码更高效:

XGPU = gpuArray(X);
YGPU = gpuArray(Y);
HGPU = gpuArray(H);
EGPU = gpuArray(E);

% Perform kron format elementwise multiplication betwen the first two dims
% of X and Y, keeping the third dim aligned and "pushing out" leftover dims
% from Y to the back
mults = bsxfun(@mtimes,permute(XGPU,[4,2,5,1,3]),permute(YGPU,[1,6,2,7,3,4,5]));
mults3D = reshape(mults,N2,N2,[]);
clear mults;
Emults3D = reshape(EGPU*reshape(mults3D,size(mults3D,1),[]),size(mults3D));

% Trace summations by using linear indices of diagonal on 3D slices in Emults3D
MN = N2;
idx = 1:MN+1:MN^2;
idx2D = bsxfun(@plus,idx(:),MN^2*(0:size(Emults3D,3)-1));
pr_sums = sum(Emults3D(idx2D),1);
clear Emults3D;
clear idx2D;

% Perform "M/pr" equivalent elementwise divisions and then use
% matrix-multiplication to reduce the iterative summations
Mp = bsxfun(@rdivide,mults3D,reshape(pr_sums,1,1,[]));
clear pr_sums;
clear mults3D;

outGPU = reshape(Mp,[],size(Mp,3))*reshape(permute(HGPU,[3,1,2]),[],1);
outGPU = reshape(outGPU,N2,N2)/(sum(sum(sum(HGPU))));

clear Mp;

out = gather(outGPU);
一些相关信息:X是一个3D MXN阵列。Y是一个5D MXNXP阵列。H是大小为MxPxP的2D直方图切片的3D构造。E是一个M^2xM^2矩阵布尔掩码

当前的计算瓶颈是Emults3D的创建和Mp的创建

我的问题如下:

  • 有没有更好的方法来更好地处理GPU内存分配?即使使用4GB的VRAM在远超硬件上进行测试,也无法完成满量程的计算,需要进行截断和修剪

  • 编写CUDA内核会提高并行化和速度吗?我应该针对哪些计算

  • 这些线的哪些部分实际上是慢的:重塑还是乘法/除法?在这两种情况下,是否有其他并行化的替代方案,如pagefun或类似的方案来减少计算时间


我将注意到,一旦计算算法得到改进,我计划在开始时使用gpuArray构造函数删除尽可能多的host->gpu传输。这还包括等到代码中的后期再构建E和H,这样它们就不会在开始时浪费宝贵的VRAM空间。

从广义上说,我认为,由于这些
排列为多维阵列带来了大量内存传输,因此具有更好内存带宽的GPU可能会有所帮助。所以,我想新的可能不错。此外,这些范围数组:
idx=1:MN+1:MN^2
0:size(Emults3D,3)-1等可以构建。我试图避免通过pagefun创建Emults3D时的双重重塑,但这似乎会导致较慢的结果。有可能创建kron乘法的线程内核吗?因为它重载以处理gpuarray以避免排列?在主机上进行排列然后传输结果可能会减轻繁重的部分吗?无法回答第一部分。关于第二部分,我认为如果设备能够容纳数据,在设备上进行排列会更好。关于第三个问题:尝试探查器(
profile On
,在运行之前,
profile viewer
)。如果速度真的是你主要关心的问题,那么你为什么要依赖Matlab?在这一点上,这是由于它的gpu计算的简单实现。如果matlab将限制我们的潜在速度,我们可以切换到C。但鉴于我对实际CUDA编程的有限知识,只是对matlab的实现稍有熟悉,这是一个相当不错的项目,我希望首先在迭代循环中实现比2倍更快的速度。我曾短暂地使用分析器,至少提取了慢行。我将通过分离整形和乘法来进一步研究。