はるかに大きい割り当てられたメモリにマトリックスを割り当てることにより、MATLABはそれを 'コピー'しながら何らかの方法で複製し、コピーされるマトリックスが十分に大きい場合、メモリオーバーフローが発生します。これはサンプルコードです:
main_mat=zeros(500,500,2000);
n=500;
slice_matrix=zeros(500,500,n);
for k=1:4
parfor i=1:n
slice_matrix(:,:,i)=gather(gpuArray(rand(500,500)));
end
main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)=slice_matrix; %This is where the memory will likely overflow
end
ただ「スマッシュ」にどのような方法slice_matrix
にmain_mat
オーバーヘッドなし?前もって感謝します。
編集:
main_mat
あらかじめ割り付けておくとオーバーフローが発生します。main_mat
がmain_mat=zeros(500,500,1);
(小さいサイズ)で初期化された場合、オーバーフローは発生しませんが、行列が割り当てられる前に割り当てが行われないため、オーバーフローが遅くなります。これにより、範囲がk
増えるにつれてパフォーマンスが大幅に低下します。
main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)
、メモリオーバーフローの問題が発生する場所です。main_mat
事前に割り当てたときに検証されます。オーバーフローします。オーバーフローしない場合はオーバーフローしません。Matlabは「メモリ不足エラー」を返します。
h=h+slice_matrix(end)
前にmain_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)=slice_matrix;
(およびhを0で初期化して)か?この新しく追加された行がすでにメモリの問題を引き起こしていると思います。
parfor
ます。さらに、parfor
データを各ワーカーにコピーします。したがって、4つのワーカーを想定して、データをRAMに4回複製します。