PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : مقایسه سرعت عمل ضرب ماتریس ها در FPGA و miniPC



sobhan537
20-05-2016, 13:48
با عرض سلام و خسته نباشید خدمت عزیزان و دوستان گلم

برای یک پروژه ای من نیاز دارم که عملیات پردازشی تقریبا سنگینی رو با نهایت سرعت انجام بدم. میخوام یک ماتریس 100*100 رو در یک ماتریس 100*100 دیگه ضرب کنم و حاصل رو در یک ماتریس جدید ذخیره کنم. و این کار رو بارها و بارها با نهایت سرعت انجام بدم.

راستش تا بحال با FPGA کار نکردم. ولی تا اونجایی که پرسوجو کردم شنیدم میگن پیاده سازی عمل ضرب در FPGA نیاز به گیت های فراوانی داره و دردسر سازه. میگن برای همچین ضربی ماتریس ها رو به ماتریس های 5*5 تکه تکه میکنن بعد ضرب میکنن و دردسر داره و به همین دلیل سرعت نهایی عملیات هم میاد پایین و از حالت Real Time خارج میشه! به همین خاطر به ذهنم رسید شاید با این بردهای سیستم عامل دار با استفاده از نرم افزراهایی مثل متلب بشه همچین عملیاتی رو با سرعت بیشتر نسبت به FPGA انجام داد!

لطفا نظرات خودتون رو بگید. برای انجام این عملیات بهتره از FPGA استفاده کنم؟ یا miniPC ؟

mrm
20-05-2016, 20:35
سلام
اولین مشخصه ایی که باید مشخص کنید اعدادتون floating point هست؟ یا اعداد صحیح؟ با چه دقتی؟
در صورت وجود Floating point ایا میشه اونها رو به Fixed point تبدیل کرد ( با توجه به کم شدن دقت ،کاهش هزینه، افزایش زمان تست )
لینک ازتباطی ورودی و خروجی داده ها چی هست؟
ایا نیاز به ذخیره سازی ( موفق ، دائم ) وجود داره یا فقط باید ضرب انجام بشه و در خروجی قرار بگیره؟!!!!
نسبت هزینه به انجام پروژه براتون چقدر هست؟

sobhan537
21-05-2016, 00:26
پروژه ازمایشگاهیه. نباید هزینه بره بالا. کمتر از 600 هزار تومن باید باشه
اعداد Floating هستش. توسط یک ADC از سیگنال نمونه برداری میشه و اعداد داخل ماتریس ها ریخته میشه.
ذخیره سازی موقت و دایم نیاز نیست.

mrm
21-05-2016, 13:24
خب بازم اینجا شکل خوندن از adc مطرح میشه؟
اگر یه شمای کلی از طرح رو بگید راحت تر میتونم بهتون بگم که میشه یا نه!!!
مثلا چند تا adc هست؟
سرعت نمونه گیری adc ها چقدر هست؟
ایا یکی از ماتریس ها عدد ثابت هست یا هردو ورودی از adc ها هستن؟
نتیجه این سوالها به این جواب میرسه که به ازا هر ورودی از adc یک ضرب رو انجام بدید (که کار راحتی هست) یا اینکه کل ماتریس رو تولید کنید بعد ضرب رو انجام میدید( که میشه ولی احتیاج به فردی هست که بتونه
این کار رو انجام بده و فکر کنم هزینه اش یکم بیشتر میشه )

sobhan537
21-05-2016, 16:04
مهندس جان، پروژه منعطفه و همه این مواردی که ذکر کردید، به خودم بستگی داره. مثلا اگر از الگوریتم های ساده مثل lms یا rls استفاده کنم، به ازای هر ورودی adc یک ضرب انجام میدم. ولی خب سرعت همگرایی میاد پایین. ولی اگه بخوام از الگوریتم های پیچیده شبکه عصبی استفاده کنم، اونموقع باید کل ماتریس ها تشکیل بشه بعد ضرب بشه. که fpga به دلیل داشتن تعداد بلوک ضرب کننده محدود، نمیتونه این کار رو انجام بده!

mrm
21-05-2016, 22:27
راستش با این چیزی که من از پروژه فهمیدم شما تعداد ضرب های خیلی محدودی دارید من نمیدونم چقدر زمان اینجا براتون مهمه ولی شما روی spartan6 راحت میتونید یه ضرب کننده با دقت 32 بیتی(float) بسازید
که با 100 مگ کلاک بخوره که میشه 100 میلیون ضرب در ثانیه. احتیاج به چند تا هم ندارید.عملا با یک MAC کارتون انجام میشه.فقط یکم کد نویسی داره.

shahin
23-05-2016, 04:10
هرجور حساب میکنم real time بودن این کار درست در نمیاد. پیاده کردن ضرب کننده خیلی سنگین نیست ولی این جا شما تعداد خیلی زیادی ضرب کننده و جمع کننده لازم دارید. به نظر من سریع ترین حالت رو با FPGA می تونید داشته باشید. با توجه به این که کار تکراری هست و راحت میشه موازی پیاده سازیش کرد!
مورد بعدی که می تونه ارزون باشه DSP هستن که کار ضرب ماتریس رو انجام میدن. اگه از میکروی stm32f4 استفاده کنید یه DSP داخلش هست و با یه هزینه کم می تونید تست کنید. توی راهنماش چیزی در مورد ابعاد ماتریسی که میتونه ضرب کنه پیدا نکردم برای همین فکر میکنم محدودیتی نباشه از این نظر. این میکرو FPU هم داره ولی به نظرم اعداد ورودی رو صحیح نگه دارید! این طوری شاید به سرعت قابل قبول تری برسید!
Matrix Multiplication (You can see links before reply)