我正在使用包含许多行的项目:
W = gpuArray(x, y);
// or...
W = zeros(x, y, 'gpuArray');
此代码在不支持CUDA的计算机上失败。
我很惊讶gpuArray
本身并没有退缩。
有人能建议一个整洁的策略来调整代码,以便它只尝试在支持它的机器上使用CUDA吗?
答案 0 :(得分:2)
我个人在我的代码中这样做:我在GPU或CPU上初始化一个数组,具体取决于布尔值(我已经选择了...... Parameters.UseGPU)。
if (Parameters.UseGPU)
W = gpuArray(x,y);
else
W = zeros(x,y);
end
然后我使用'喜欢'在后续分配中:
W2 = zeros(x,y,'like',W);
这让我可以使用稀疏,gpuArray和类似的,具体取决于我在参数中放置的标志。
这对我有用,因为我有很少的入口点,并且它足够简单,以确保所有类属性都是正确的类型 - 我看一次这个参数并拥有相同类型的所有东西,即使它改变了后来。
但是,当你有大量需要初始化数组的各种函数并且没有给出合适类型的数组作为输入时,我不认为这是一种可行的方法。在这种情况下,我相信我会写一个像
这样的函数function arr = initialize(x, y) % or varargin or whatever.
if (Param.UseGPU)
W = gpuArray(x, y);
%etc
end
end
在这种情况下,您应该将UseGPU作为只读持久性东西,以检查首次使用时是否存在合适的GPU。混合事物并不是一个很大的问题,Matlab可以很好地处理转换到GPU。只是你可能认为你不再使用GPU了,但是大量的阵列仍然是GPU,而你正在进行不必要的转换和数据发送=慢。