我是MATLAB gpu计算的新手。在下面的代码中,我使用了一些直接在设备中创建的gpu数组。但是,NVidia Visual Profiler显示存在大量的设备到主机(D2H)内存副本。 请您了解如何发现并删除它们。我的代码如下:
function [x]=myFunction()
C = rand(1024,2,'gpuArray');
D = rand(1024,2,'gpuArray');
b = rand(1024,1,'gpuArray');
DT = transpose(D);
[n,m]=size(C);
%define variables of algorithm
x=zeros(n,1,'gpuArray');
F=zeros(n,m,'gpuArray');
y=ones(n,1,'gpuArray');
gpuZero = zeros(1,1,'gpuArray');
z=C(1,:) * DT(:,1);
x(1)=b(1)/z;
F(1,:)=C(1,:)/z;
v=DT(:,2);
y(1)=-F(1,:)*v;
si = tril(reshape(cumsum(reshape(C(2:end,:)*DT,n,n-1),2),n-1,n)); // completely on GPU memory
for i=2:n-1
i_1 = i-1;
t=C(i,:)-si(i_1,1:i_1)*F(1:i_1,:);
z=z+t*v;
w=b(i)-si(i_1,1:i_1)*x(1:i_1);
x(1:i)=x(1:i)+w/z*y(1:i);
F(1:i,:)=F(1:i,:)+y(1:i)*(t/z);
v=DT(:,2:i+1)*y(1:i);
y(1:i)=[gpuZero;y(1:i_1)]-F(1:i,:)*v;
end
%i=n
z=z+(C(n,1:m)-si(n-1,1:n-1)*F(1:n-1,:))*v;
w=b(n)-si(n-1,:)*x;
x=x+w/z*y;
//exit; // for visual profiler
end