por que o MATLAB gpuarray é muito mais lento ao adicionar apenas duas matrizes?

Recentemente, empreguei a biblioteca MATLAB CUDA para alguns cálculos de matriz absolutamente simples na gpu. Mas os resultados do desempenho são muito estranhos. Alguém poderia me ajudar a entender exatamente o que está acontecendo e como posso resolver o problema. Desde já, obrigado. Observe que os seguintes códigos são executados na gpu preta geforce GTX TITAN.

Suponha que a0, a1, ... a6 sejam 1000 * 1000 gpuarrays e U = 0,5 e V = 0,0

titan = gpuDevice();
tic();

for i=1:10000
a6(1,1)=(0.5.*(a5(1,1)-a0(1,1)))-(a1(1,1)+a2(1,1)+a3(1,1))-(a5(1,1).*U./3.0)-(a5(1,1).*V./2.0)+(0.25.*a5(1,1).*a4(1,1));  
end

wait(titan);
time = toc()

o resultado para o tempo = 17,98 segundos

agora redefinindo a0, a1, ... a6 e U e V para o emprego na CPU e calculando o tempo necessário:

tic();

for i=1:10000
a6(1,1)=(0.5.*(a5(1,1)-a0(1,1)))-(a1(1,1)+a2(1,1)+a3(1,1))-(a5(1,1).*U./3.0)-(a5(1,1).*V./2.0)+(0.25.*a5(1,1).*a4(1,1));  
end

time= toc()  

o resultado para o tempo = 0,0098 segundos

portanto, mais de 1800 vezes mais rápido na CPU !!!!

então eu decidi fazer os cálculos anteriores em toda a matriz, em vez de elementos específicos, e aqui estão os resultados:

Resultados para a execução em gpu:

titan = gpuDevice();
tic();
for i=1:10000
a6=(0.5.*(a5-a0))-(a1+a2+a3)-(a5.*U./3.0)-(a5.*V./2.0)+(0.25.*a5.*a4);  
end
wait(titan);
time = toc()   

o resultado para o tempo = 6,32 segundos, o que significa que a operação em toda a matriz é muito mais rápida do que em um elemento específico!

Resultados para a execução na CPU:

tic();
for i=1:10000
a6=(0.5.*(a5-a0))-(a1+a2+a3)-(a5.*U./3.0)-(a5.*V./2.0)+(0.25.*a5.*a4);  
end

time= toc()  

o resultado para o tempo = 35,2 segundos

E AQUI ESTÁ O RESULTADO MAIS SURPREENDENTE: supondo que a0, a1, ... a6 e U e V sejam apenas 1 * 1 gpuarrays e executando o seguinte:

titan = gpuDevice();
tic();
for i=1:10000
a6=(0.5.*(a5-a0))-(a1+a2+a3)-(a5.*U./3.0)-(a5.*V./2.0)+(0.25.*a5.*a4);  
end
wait(titan);
time = toc()  

o resultado para o tempo = 7,8 segundos

é ainda mais lento que o correspondente case 1000 * 1000!

Infelizmente, a linha a6 (1,1) = (0,5. * (A5 (1,1) -a0 (1,1))) - (a1 (1,1) + a2 (1,1) + a3 (1, 1)) - (a5 (1,1). * U./3.0)-(a5(1,1).*V./2.0)+(0.25.*a5(1,1).*a4(1, 1)); é uma das linhas entre cerca de 100 linhas, todas em um único loop for e essa linha provou ser um gargalo real, levando cerca de 50% de todo o tempo de cálculo necessário! alguém poderia me ajudar? observe que transferir essa parte dos cálculos na CPU não é uma opção, porque a linha de gargalo está em um loop for e envia a1, ... a6 para a CPU e chamar os resultados para gpu em cada iteração consome muito mais tempo. qualquer conselho é realmente muito apreciado.

questionAnswers(2)

yourAnswerToTheQuestion