【问题标题】:Matlab GPU arrayfun shared variableMatlab GPU arrayfun 共享变量
【发布时间】:2012-11-16 10:49:14
【问题描述】:

我正在使用 GPU 计算 与函数 arrayfungpuArray 对象对我的函数上的 gpuArray 变量的元素执行逐元素函数:

[ output ] = MyFunc( element, SharedMatrix )
//
// Process element with Shared Matrix
//
end

我的代码是这样的:

SharedMatrix = magic(5000); %Large Memory Object
SharedMatrix = gpuArray(SharedMatrix);
elements = magic(5);
gpuElements = gpuArray(elements );
//Error on next line, SharedMatrix object must be a scaler.
result = arrayfun(@MyFunc,gpuElements,SharedMatrix); 

听说全局变量不能用于GPU计算

有没有办法通过arrayfun 做到这一点?

【问题讨论】:

  • 您还需要将 SharedMatrix 转换为 gpuArray。
  • 即使我这样做了,它也会逐个元素地处理它,而不是作为一个整体矩阵。它需要与 gpuElements 矩阵 具有相同的维度

标签: matlab matlab parallel-processing shared-memory gpgpu


【解决方案1】:

使用最新版本的 Parallel Computing Toolbox,这可以通过将嵌套函数与 arrayfun 结合使用来完成,例如:

function result = gpueg()

largeArray = gpuArray.rand(5000);

smallArray = magic(5);

    function out = myNestedFcn(in)
    % nested function accesses 'smallArray'    
        element = ceil(in * 25);
        out = smallArray(element);
    end

result = arrayfun(@myNestedFcn, largeArray);

end

【讨论】:

    【解决方案2】:

    arrayfun 目前要求所有输入的大小(或标量)兼容,并且以元素方式完成处理。

    另外,Matlab 中的Parallel Computing Toolbox 不支持Global Variables,所以不能使用Parallel Computing Toolbox

    【讨论】:

      【解决方案3】:

      也许你可以使用handle class:

      classdef VarByRefContainer < handle
          properties
              val = [];
          end
      end
      
      handle = VarByRefContainer;
      handle.val = SharedMatrix;
      cellfun(@myfun, {handle, handle, handle});
      

      另见this question

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-23
        • 2019-10-17
        • 2017-07-15
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多