1

这个问题类似,我试图在 GPU 上运行的 cellfun 线程之间共享一个矩阵。

由于 GPU 执行不支持全局变量,我想我可以定义一个句柄类对象数组,并引用共享矩阵,因此句柄将传递给每个 cellfun 实例。

classdef VarByRefContainer < handle
    properties
        val = [];
    end
end

handle = VarByRefContainer;
handle.val = SharedMatrix;
cellfun(@myfun, {handle, handle, handle});

Matlab 似乎接受了这一点,但仍有几个问题:

  1. 这安全吗?即,如果我为元素 [1,3,5] 和 [2,4] 并行赋值,是否存在赋值冲突的可能性?
  2. 这有效率吗?即处理程序类可能存储在主机上,而在 GPU 上引用内存可能是一项耗时的操作。我想避免这种情况。
4

1 回答 1

1

我将在此处发布与其他问题相同的答案 - 您可以使用上层变量和嵌套函数共享数据:

function result = gpueg()

largeArray = gpuArray.rand(5000);

smallArray = magic(5);

    function out = myNestedFcn(in)
    element = ceil(in * 25);
    out = smallArray(element);
    end

result = arrayfun(@myNestedFcn, largeArray);

end
于 2013-06-27T14:26:58.250 回答