मैंने GPU पर गैर-रैखिक सॉल्वरों की एक विस्तृत विविधता को लागू किया है, जिसमें LBFGS, Barzilai Borwein ढाल मूल और गैर-रैखिक संयुग्म ढाल शामिल हैं।
इसके लिए, दाई और युआन का गैर-रेखीय संयुग्म ढाल सबसे अधिक कुशल रहा है। सामान्य तौर पर, nonlinear संयुग्म ढाल के अन्य संस्करण अधिक कुशल हो सकते हैं (जैसे कि CG-DESCENT), लेकिन इसे लागू करने के लिए मुश्किल भी हो सकता है।
एलबीएफजीएस सामान्य रूप से एक बहुत ही ठोस विकल्प है, और जब तक आप वास्तव में स्मृति के लिए बंधे नहीं होते हैं, यह शायद शुरू करने के लिए सबसे अच्छी जगह है।
दोनों संयुग्म ढाल और BFGS को लाइन खोज की आवश्यकता होती है, जो कि जहां fp32 एक समस्या बन जाती है। लाइन खोज के लिए मानक वोल्फ स्थितियों का उपयोग करने के बजाय, मैं यहां सुझाए गए अनुमानित वुल्फ स्थिति का उपयोग करने का सुझाव दूंगा । कागज थोड़ा शामिल है, लेकिन महत्वपूर्ण सामान समीकरण 4.1 है। अनिवार्य रूप से वे स्पष्ट रूप से सटीक परिचय देते हैं जिसके साथ आप अपने फ़ंक्शन की गणना कर सकते हैं।
GPU के लिए विचार:
आपके पास बहुत सी छोटी समस्याएं हैं, जो कि एक बड़ी समस्या के मेरे उपयोग के मामले से थोड़ी अलग है। यदि आप एक ब्लॉक में सभी थ्रेड्स का उपयोग करने के लिए फ़ंक्शन और ग्रेडिएंट मूल्यांकन को समानांतर कर सकते हैं, तो प्रति GPU ब्लॉक (या ताना) के बजाय 1 समस्या को चलाने पर विचार करें। इस तरह यह एक समस्या नहीं है अगर अलग-अलग समस्याओं के लिए अलग-अलग संख्या में पुनरावृत्तियों की आवश्यकता होती है।
यदि यह कोई विकल्प नहीं है, तो मैं LBFGS सॉल्वर के साथ जाऊंगा। यदि आपका कार्य अच्छी तरह से व्यवहार किया गया है, तो आप केवल 1 के एक चरण आकार (लाइन खोज से बचने) का उपयोग करके दूर हो सकते हैं और निश्चित संख्या में पुनरावृत्तियों के लिए सभी समस्याओं को चला सकते हैं।