Neden MATLAB matris çarpımı kadar hızlı mı?
CUDA ile bazı kriterler yapıyorum, C , C# ve Java ve doğrulama ve matriks üretimi için MATLAB. Ama ben deposunda bulunan çarpma, 2048x2048 ve daha büyük matris neredeyse anında çarpılır.
1024x1024 2048x2048 4096x4096
--------- --------- ---------
CUDA C (ms) 43.11 391.05 3407.99
C (ms) 6137.10 64369.29 551390.93
C# (ms) 10509.00 300684.00 2527250.00
Java (ms) 9149.90 92562.28 838357.94
MATLAB (ms) 75.01 423.10 3133.90
Sadece CUDA rekabetçi, ama en azından C dereceye yakın ve 60x değil daha yavaş olacağını düşündüm.
Yani benim soru - Nasıl MATLAB bu kadar hızlı mı yapıyor?
C Kod:
float temp = 0;
timer.start();
for(int j = 0; j < rozmer; j )
{
for (int k = 0; k < rozmer; k )
{
temp = 0;
for (int m = 0; m < rozmer; m )
{
temp = temp matice1[j][m] * matice2[m][k];
}
matice3[j][k] = temp;
}
}
timer.stop();
Edit: Ben de C hakkında ne düşüneceğimi bilmiyorum# sonuçları. Algoritma sadece C de Java ama dev bir sıçrama 1024 ile 2048 var?
Edit2: MATLAB ve 4096x4096 sonuçları güncellendi
CEVAP
İşte benim sonuçlar Tesla C2070 ile bir makine üzerinde R2011a Parallel Computing Toolbox MATLAB:
>> A = rand(1024); gA = gpuArray(A);
% warm up by executing the operations a couple of times, and then:
>> tic, C = A * A; toc
Elapsed time is 0.075396 seconds.
>> tic, gC = gA * gA; toc
Elapsed time is 0.008621 seconds.
Düz MATLAB MATLAB matris çarpma çok hızlı bu yüzden matris çarpımı için son derece optimize edilmiş kütüphaneler kullanır. gpuArray
sürümü MAGMA kullanır.
K20c ve timeit
gputimeit
Yeni işlevleri bir Tesla ile bir makine üzerinde R2014a kullanarak güncelleştirme
>> A = rand(1024); gA = gpuArray(A);
>> timeit(@()A*A)
ans =
0.0324
>> gputimeit(@()gA*gA)
ans =
0.0022
Boş matris çarpımı üzerinden diziler b...
Neden `1000000000000000 aralığı(100000...
Neden tanıtan bir işe yaramaz MOV tali...
Neden bu kadar hızlı C, ve neden değil...
Neden kamera arkası eden typedreferenc...