c - Can I call a "function-like macro" in a header file from a CUDA __global__ function? -


यह मेरी शीर्ष लेख फ़ाइल aes_locl.h का हिस्सा है:

 < कोड>। । # परिभाषित SWAP (x) (_lrotl (x, 8) & amp; 0x00ff00ff | _lrotr (x, 8) & amp; 0xff00ff00) # परिभाषित GETU32 (पी) स्वैप (* ((u32 *) (पी))) # परिभाषित PUTU32 ( सीटी, सीटी) {* ((u32 *) (सीटी)) = स्वैप ((सेंट)); } ।   

अब .cu फ़ाइल से मैंने एक __ ग्लोबल __ फ़ंक्शन घोषित किया है और इस तरह हैडर फाइल भी शामिल है:

  #include "aes_locl.h" ..... __global__ शून्य cudaEncryptKern (u32 * _Te0, u32 * _Te1, u32 * _Te2, u32 * _Te3, अहस्ताक्षरित चार * में, u32 * rdk, अहस्ताक्षरित लंबे * लंबाई) {u32 * आरके = आरडीके; U32 s0, s1, s2, s3, t0, t1, t2, t3; S0 = GETU32 (में + थ्रेडआईडीएक्स। X * (i)) ^ आरके [0]; }  

यह मुझे निम्न त्रुटि संदेश की ओर ले जाता है:

त्रुटि: एक __ डिवाइस __ / __ वैश्विक ग्लोबल_ फ़ंक्शन से होस्ट फ़ंक्शन को कॉल करने की अनुमति केवल डिवाइस में है इम्यूलेशन मोड

मेरे पास नमूना कोड है जहां प्रोग्रामर मैक्रो को इस तरह ठीक कहता है।

क्या मैं इसे इस तरह कह सकता हूँ, या यह बिल्कुल संभव नहीं है? अगर ऐसा नहीं है, तो मैक्रोज़ को फिर से लिखने और इच्छित कोड को S0 के लिए असाइन करने का सबसे अच्छा तरीका क्या होगा, इस बारे में मुझे कुछ संकेत मिलेगा।

बहुत पहले धन्यवाद! !!

हार्डवेयर में एक अंतर्निहित रोटेट निर्देश नहीं है, और इसलिए कोई आंतरिक नहीं है इसे उजागर करने के लिए (आप कुछ नहीं दिखा सकते हैं जो अस्तित्व में नहीं है!)।

उदाहरण के लिए, अगर एक्स 32-बीट्स हैं, तो बाएं आठ बिट्स को घुमाने के लिए आप कर सकते हैं:

  ((x & lt; & lt; 8) | (x & gt; & gt; 24))  

जहां x & lt ; & lt; 8 सब कुछ आठ बिट्स को छोड़ देगा (यानी बाएं आठ बिट्स को छोड़ना), x> & gt; 24 सब कुछ सही टेंटी-चार बिट्स को दबाएगा (यानी सभी बाएं आठ बिट्स को छोड़कर), और उन्हें एक साथ ओअरिंग करके परिणाम देने की आवश्यकता होती है।

  // # define SWAP (X) (_lrotl (x, 8) & amp; 0x00ff00ff | _lrotr (x, 8) & amp; 0xff00ff00) # परिभाषित SWAP (x) (((x & lt; & lt; 8) | (x & gt; & gt; 24)) & Amp; 0x00ff00ff | ((x & gt; & gt; 8) | (एक्स एंड एलटी; & lt; 24)) & amp; 0xff00ff00)  

आप इस बात को पहचानकर यह और अधिक कुशल बना सकते हैं कि ऊपर ओवरकिल है:

  # स्वैप स्वैप (x) (((एक्स और 0xff00ff00) & gt; & gt; 8) | ((एक्स और 0x00ff00ff) & lt; & lt; 8)) < / कोड> 

Comments

Popular posts from this blog

c# - sqlDecimal to decimal clr stored procedure Unable to cast object of type 'System.Data.SqlTypes.SqlDecimal' to type 'System.IConvertible' -

Calling GetGUIThreadInfo from Outlook VBA -

Obfuscating Python code? -