हां। सबसे पहले, यह समझना सबसे अच्छा होता है कि जब आप -gencode
का उपयोग करते हैं तो क्या होता है। प्रत्येक डिवाइस लक्ष्य आर्किटेक्चर के लिए, एक बार एनवीसीसी आपके इनपुट डिवाइस कोड को कई बार संकलित करेगा। तो आपके उदाहरण में, एनवीसीसी compute_20 के लिए एक बार संकलन चरण 1 चलाएगा और एक बार compute_13 के लिए।
जब nvcc एक .cu फ़ाइल संकलित करता है, तो यह दो प्रीप्रोसेसर मैक्रोज़, __CUDACC__
और __CUDA_ARCH__
को परिभाषित करता है। __CUDACC__
में कोई मान नहीं है, यह केवल परिभाषित किया गया है कि Cudacc संकलक है, और परिभाषित नहीं है कि यह नहीं है।
__CUDA_ARCH__
को संकलित किए गए एसएम संस्करण का प्रतिनिधित्व करने वाले एक पूर्णांक मान को परिभाषित किया गया है।
- 100 = compute_10
- 110 = compute_11
- 200 = compute_20
आदि के शब्दों में NVCC प्रलेखन CUDA टूलकिट के साथ शामिल:
वास्तुकला पहचान मैक्रो __CUDA_ARCH__
प्रत्येक एनवीसीसी सी के दौरान एक तीन अंकों की मान स्ट्रिंग xy0
(एक शाब्दिक 0 में समाप्त) असाइन किया गया है ompilation चरण 1 जो compute_xy
के लिए संकलित करता है। वर्चुअल आर्किटेक्चर को निर्धारित करने के लिए जीपीयू कार्यों के कार्यान्वयन में इस मैक्रो का उपयोग किया जा सकता है जिसके लिए इसे वर्तमान में संकलित किया जा रहा है। होस्ट कोड (गैर-जीपीयू कोड) इस पर निर्भर नहीं होना चाहिए।
तो, अपने मामले जहां __ballot()
उपयोग करना चाहते हैं, तो आप ऐसा कर सकते हैं:
....
#if __CUDA_ARCH__ >= 200
int b = __ballot();
int p = popc(b & lanemask);
#else
// do something else for earlier architectures
#endif
धन्यवाद एक बहुत! इसका काम :) और इसका क्या अर्थ है: CUDA_VERSION? क्या यह CUDA टूलकिट के संस्करण संख्या के बराबर है? – Alex
हां, [उदाहरण के लिए यहां देखें] (http://developer.download.nvidia.com/compute/cuda/4_2/rel/toolkit/docs/online/group__CUDA__TYPES_g3c09bba9b1547aa69f1e346b82bcdb50.html)। दरअसल, यह प्रमुख संस्करण समय 1000 + मामूली संस्करण समय 10 है, इसलिए 4.2 -> 4020। – harrism