ورود

View Full Version : افزایش سرعت ضرب ماتریسی در متلب



bn6120
سه شنبه 06 مرداد 1394, 13:17 عصر
سلام
دوستان کسی تا به حال از کتابخانه BLAS و LAPACK (https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0CB8QFjAAahUKEwjlpLrUiv3GAhWLsxQKHW85Dy4&url=http%3A%2F%2Fwww.mathworks.com%2Fhelp%2Fmatlab %2Fmatlab_external%2Fcalling-lapack-and-blas-functions-from-mex-files.html&ei=vxG3VaXJF4vnUu_yvPAC&usg=AFQjCNElt0bQcu1HZmTzTkcVUdL2AF8e4w&sig2=bESxaYs7g8l_4l2OpRLVDw&bvm=bv.98717601,d.d24) برای افزایش سرعت ضرب دو ماتریس بزرگ استفاده کرده.من دو تا ماتریس خیلی بزرگ تو متلب ضرب میکنم که زمان زیادی میبری به هین خاطر بردمش تو محیط MEX FILE ، سرعت کاهش پیدا کرد ولی باز نیاز به کاهش زمان دارم...به همین منظور این دو کتابخانه معرفی شده به من....
دوستان اگر راهکار و اطلاعی در این زمینه دارن ممنوم میشم
راهنمایی کنند...
با تشکر

rahnema1
سه شنبه 06 مرداد 1394, 18:57 عصر
سلام
تا جایی که اطلاع دارم متلب از کتابخانه MKL استفاده می کنه که نسخه بهینه سازی شده ی blas و lapack هست و سرعت بالا داره.
ماریسها چند در چند بودند و چه طور ضرب کردید؟
لطفا به لینک زیر مراجعه کنید که از gpuArray استفاده کرده و با ضرب اون سرعت افزایش پیدا کرده
http://stackoverflow.com/questions/6058139/why-is-matlab-so-fast-in-matrix-multiplication

ehsan_faal
سه شنبه 06 مرداد 1394, 19:00 عصر
سلام.
لازم نیست شما از اون کتابخونه ها استفاده کنی جون که متلب توی ورژنهای قبلی از اونها استفاده میکرده برای عملیات ماتریسی و توی ورژنهای اخیر از MKL .
عملیات ماتریسی توی متلب تا جای ممکن بهینه شده

bn6120
سه شنبه 06 مرداد 1394, 23:00 عصر
سایز ماتریس اول [1*10] , دومی [49284*10] هستش
ضرب در m -file به صورت زیر انجام شده

SS2=sum(bsxf(@times,B2,T2_DCT(sind2,:)));

و در mex file با چند تا حلقه انجام شده است


for (int i = 0; i < N_T1_DCT; i++)
{
sum = 0;
int plus = M_T1_DCT_int * i;
for (int j = 0; j < array_len; j++)
{
sum += T1_DCT[sind_int[j]-1 + plus] * B[j];
}
output[i] = sum;
}

rahnema1
چهارشنبه 07 مرداد 1394, 16:15 عصر
سلام
باز هم فکر می کنم در سوال شما ابهام وجود داره مثل sind چیه؟
با توجه به این کد می تونید به صورت زیر بنویسید
SS2 = B2' * T2_DCT(sind2, :);

bn6120
جمعه 09 مرداد 1394, 11:51 صبح
سلام
باز هم فکر می کنم در سوال شما ابهام وجود داره مثل sind چیه؟
با توجه به این کد می تونید به صورت زیر بنویسید
SS2 = B2' * T2_DCT(sind2, :);

من بنا به شرایطی که الگوریتم من داره فقط سطرهای خاصی از ماتریس T2_DCT در B2 ضرب میکنم ، که در این برنامه num_coff تعداد این سطرها و selected index(sind2
)
اون سطرهای موردنظر از ماتریس نشون میده....


راجب مطلب دوم باید بگم برای افزایش سرعت من در جایی خوندم تابع bsfx مقداری از این ضرب شما سریع تر است...