【问题标题】:how can i convert my cpu code of dot product of two matrices to GPU in matlab如何在matlab中将我的两个矩阵点积的cpu代码转换为GPU
【发布时间】:2014-11-11 06:46:23
【问题描述】:

我想在 GPUarray 中取两个矩阵的加权和以加快速度。例如我在 cpu 上的代码如下:

mat1 = rand(19,19);

mat2= rand(19,19);

Receptive_fieldsize = [4,3]; 

overlap = 1;

Output = GetweightedSum(mat1,mat2, Receptive_fieldsize,overlap); %this will output in an 6x6 matrix

我的函数体在哪里:

function Output = GetweightedSum(mat1,mat2, RF,overlap)

gap = RF(1) - overlap;
size_mat = size(mat1);
output_size=[6,6];
for u=1: output_size(1)
    for v=1: output_size(2)
        min_u = (u - 1) * gap + 1;
        max_u = (u - 1) * gap + RF(1);
        min_v = (v - 1) * gap + 1;
        max_v = (v - 1) * gap + RF(2);

       input1 = mat1(min_u:max_u,min_v:max_v);
       input2 = mat2(min_u:max_u,min_v:max_v); 
       Output(u,v) = sum(sum(input1 .*input2));

   end
end

如何将其转换为 GPUfunciton。我可以直接做吗,或者我可以在GPU代码中使用for循环。我对 GPU 完全陌生,所以对此一无所知。 如果有人指导我,或者将上面的代码更改为 GPU 功能的参考,我将不胜感激,以便我可以从中学习。 问候

【问题讨论】:

  • @Divakar 纠正了这一点。目前避免这种情况。

标签: matlab neural-network gpu matrix-multiplication


【解决方案1】:

看看代码和它们旁边的 cmets 是否对你有意义 -

function Output = GetweightedSumGPU(mat1,mat2, RF,overlap)

%// Create parameters
gap = RF(1) - overlap;
output_size=[6,6];
sz1 = output_size(1);
sz2 = output_size(2);

nrows = size(mat1,1); %// get number of rows in mat1

%// Copy data to GPU
gmat1 = gpuArray(mat1);
gmat2 = gpuArray(mat2);

start_row_ind = gpuArray([1:RF(1)]'); %//' starting row indices for each block
col_offset = gpuArray([0:RF(2)-1]*nrows); %// column offset for each block

%// Linear indices for each block
ind = bsxfun(@plus,start_row_ind,col_offset);

%// Linear indices along rows and columns respectively
ind_rows = bsxfun(@plus,ind(:),[0:sz1-1]*gap);
ind_rows_cols = bsxfun(@plus,ind_rows,permute([0:sz2-1]*gap*nrows,[1 3 2]));

%// Elementwise multiplication, summing and gathering back result to CPU
Output = gather(reshape(sum(gmat1(ind_rows_cols).*gmat2(ind_rows_cols),1),sz1,sz2));

return;

【讨论】:

  • 让我试试。一会儿就会来找你
  • @khan 我在使用 GPU 的系统上对其进行了测试,但似乎并没有胜过 CPU 代码,但我想这对你来说可能是一次学习经历。我认为问题在于你没有让 GPU 做足够的工作。
  • 我同意,gpuendtime = 0.0083 CPUtimetaken = 0.0578 我的结果是这样的......但是是的,我试图从它开始。图像越来越多,您不认为如果我有 1000 张图像,这个 0.05 会影响我的最终结果吗?或者我是否应该重新排列我的代码,顺便说一句,非常感谢。
  • @khan 是mat1mat2 中的图像数据吗?一大笔开销是将数据复制到 GPU。如果是这样,我认为您只需要复制一次吗?此外,在调用 GPU 函数并将 gpuArray 数据输入到 GPU 函数之前尝试通过复制来进行基准测试。
  • @khan 是的。那就是-gmat1 = gpuArray(mat1); gmat2 = gpuArray(mat2);,然后像这样调用函数-OutputGPU = GetweightedSumGPU(gmat1,gmat2, Receptive_fieldsize,overlap);。此外,注释掉 GPU 函数内的行 - `gmat1 = gpuArray(mat1); gmat2 = gpuArray(mat2); 并编辑此行 - nrows = size(gmat1,1); 并编辑函数语法 - function Output = GetweightedSumGPU(gmat1,gmat2, RF,overlap)
猜你喜欢
  • 1970-01-01
  • 2019-07-12
  • 2021-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-27
  • 2019-06-26
  • 2017-04-06
相关资源
最近更新 更多