2012-10-02 9 views
5

मैं #define द्वारा संकलित समय में CUDA गणना क्षमता (संस्करण) कैसे प्राप्त कर सकता हूं? उदाहरण के लिए, अगर मैं __ballot का उपयोग करें और साथ संकलनक्या मुझे #define द्वारा संकलन समय में CUDA गणना क्षमता (संस्करण) मिल सकता है?

nvcc -c -gencode arch=compute_20,code=sm_20 \ 
     -gencode arch=compute_13,code=sm_13 
     source.cu 

मैं #define के आधार पर अपने कोड में गणना क्षमता का संस्करण प्राप्त करने के लिए __ballot के साथ या बिना कोड की शाखा चयन कर सकते हैं?

उत्तर

15

हां। सबसे पहले, यह समझना सबसे अच्छा होता है कि जब आप -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 
+0

धन्यवाद एक बहुत! इसका काम :) और इसका क्या अर्थ है: CUDA_VERSION? क्या यह CUDA टूलकिट के संस्करण संख्या के बराबर है? – Alex

+1

हां, [उदाहरण के लिए यहां देखें] (http://developer.download.nvidia.com/compute/cuda/4_2/rel/toolkit/docs/online/group__CUDA__TYPES_g3c09bba9b1547aa69f1e346b82bcdb50.html)। दरअसल, यह प्रमुख संस्करण समय 1000 + मामूली संस्करण समय 10 है, इसलिए 4.2 -> 4020। – harrism

संबंधित मुद्दे