2012-01-23 29 views
5

मेरे पास एक फ़ंक्शन पॉइंटर सरणी है जिसका उपयोग मैं उपयुक्त cblas_xgemm (उदा। cblas_dgemm या cblas_sgemm, आदि को एटीएलएएस/सीबीएलएएस से) कॉल करने के लिए करता हूं।cblas_dgemm और cblas_sgemm फ़ंक्शन पॉइंटर सरणी में अलग-अलग सूचक प्रकार क्यों होंगे?

यह बहुत अच्छा काम करता है जब मैं इसे cblas_dgemm फ़ंक्शन पॉइंटर द्वारा उपयोग करने के लिए कहता हूं; डीजीएमएम उचित तर्क के साथ बुलाया जाता है और एक सही परिणाम देता है।

ldc must be >= MAX(N,1): ldc=0 N=2Parameter 14 to routine cblas_sgemm was incorrect 

मैं एक short test program जो समस्या को दर्शाता है लिखा है:

हालांकि, जब मैं समारोह सूचक द्वारा cblas_sgemm कहते हैं, मैं निम्नलिखित उत्पादन मिलता है। फ़ंक्शन पॉइंटर काम ठीक किए बिना cblas_sgemm पर कॉल करता है।

test_cblas_sgemm.c:20:3: warning: initialization from incompatible pointer type [enabled by default] 

अगर मैं बाहर टिप्पणी समारोह सूचक सरणी परिभाषा cblas_sgemm लाइन, मुझे नहीं पता:

नोट विशेष रूप से निम्नलिखित जीसीसी चेतावनी (भी सार ऊपर लिंक, जो पूर्ण जीसीसी आउटपुट है देखें) cblas_dgemm लाइन के लिए भी ऐसी चेतावनी प्राप्त करें। लेकिन इसका कोई मतलब नहीं है क्योंकि इन दोनों कार्यों में एक ही रिटर्न प्रकार होना चाहिए!

void cblas_sgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, 
       const enum CBLAS_TRANSPOSE TransB, const int M, const int N, 
       const int K, const float alpha, const float *A, 
       const int lda, const float *B, const int ldb, 
       const float beta, float *C, const int ldc); 
void cblas_dgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, 
       const enum CBLAS_TRANSPOSE TransB, const int M, const int N, 
       const int K, const double alpha, const double *A, 
       const int lda, const double *B, const int ldb, 
       const double beta, double *C, const int ldc); 

तो क्या देता है:

यहाँ cblas.h से उपयुक्त लाइनें हैं? क्या यह किसी एक शीर्षलेख से xgemm कार्यों में से एक प्राप्त कर रहा है और दूसरा एक दूसरे से है? या मैं कुछ अजीब फ़ंक्शन पॉइंटर समस्या से निपट रहा हूं?

+0

क्या आप संभवतः कुछ कोड दिखा सकते हैं, कुछ संदर्भ के बिना सार संकलक त्रुटियों पर टिप्पणी करना बहुत मुश्किल है। – talonmies

+0

प्रश्न में लिंक कोड है: https://gist.github.com/1671571 –

उत्तर

1

आपका प्रश्न इस तथ्य को उबालने लगता है कि आपके पास अलग-अलग हस्ताक्षरों के कार्य हैं जिन्हें आप फ़ंक्शन पॉइंटर सरणी से कॉल करने का प्रयास कर रहे हैं। मैंने कभी यह कोशिश नहीं की है, लेकिन थोड़ी सी शोध से, ऐसा नहीं लगता है कि यह संभव है। यह समझ में आता है, क्योंकि एक स्थाई टाइप की गई भाषा इस युद्धाभ्यास की प्रकार की सुरक्षा का मूल्यांकन करने में सक्षम नहीं होगी।

मैंने बूस्ट :: संस्करण, और इसके लिए अन्य कामकाज का उपयोग करने के सुझावों को देखा है, लेकिन चूंकि आप उस लाइब्रेरी से लिंक कर रहे हैं जो हमारे गाउन नहीं है, मुझे यकीन नहीं है कि उन विकल्पों का पालन करने में बहुत अधिक मूल्य है।

यदि आप साबित करना या अस्वीकार करना चाहते हैं, तो आप अपने परीक्षण कार्यक्रम से सीबीएलएएस को हटा सकते हैं, और केवल हस्ताक्षर के कई तरीकों के साथ एक वर्ग को कार्यान्वित कर सकते हैं, जो केवल डेटाटाइप में भिन्न होता है।

एक तरफ ध्यान दें, कॉलम प्रमुख एक बड़ा दर्द है।

+0

क्या आप समझा सकते हैं कि हस्ताक्षर से आपका क्या मतलब है? मेरी समझ एक ही वापसी प्रकार और एक ही तर्क प्रकार + संख्या => एक ही हस्ताक्षर था। –

+0

हां, मैं इसके साथ सहमत हूं। लेकिन आपके पैरामीटर प्रकार समान नहीं हैं। बीटा को देखो। यह एसजीई कार्यों में एक फ्लोट है और डीजीई कार्यों में दोगुना है। मैंने हाल ही में बीएलएएस के साथ काम किया है, मुझे अस्पष्टता से याद है कि उन कार्यों का डेटा डी प्रीफिक्स्ड (युगल) और एस प्रीफिक्स्ड (मैं सिंगल अनुमान लगा रहा हूं, जो सी ++ पर पोर्ट करते समय फ्लोट में बदल जाता है) के बीच अंतर होने के साथ काम करता है। – Evan

+0

ओह मेरी भलाई। मैंने [सोचा था] उन तर्क सूचियों को इतनी बारीकी से पढ़ा। आप बिल्कुल सही कह रहे है। बहुत बहुत धन्यवाद। –