2012-07-02 6 views
6

पर सी ++/सीयूडीए कक्षा उत्तीर्ण करने के लिए मेरे पास सी ++ में लिखी गई एक कक्षा है जो cuda_runtime.h से कुछ परिभाषाओं का भी उपयोग करती है, यह एडीओएल-सी नामक ओपनसोर्स प्रोजेक्ट का एक हिस्सा है, आप here देख सकते हैं!पीसीयूडीए के स्रोत मॉड्यूल

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

मैंने एक समान प्रश्न पूछा, लेकिन यहां मैं थोड़ा और समझाना चाहता हूं। तो, एनवीसीसी-क्यूबिन (talonmies के लिए धन्यवाद) का उपयोग करके मेरे सी कोड को संकलित करने का एक समाधान है और फिर इसे driver.module_from_file() के साथ आयात कर रहा है, लेकिन, मैं SourceModule का उपयोग करना चाहता हूं और उन कर्नेल को एक .py फ़ाइल के अंदर लिखना चाहता हूं, इसलिए यह अधिक उपयोगकर्ता के अनुकूल हो सकता है। मेरे उदाहरण कुछ इस तरह दिखेगा:

from pycuda import driver, gpuarray 
from pycuda.compiler import SourceModule 
import pycuda.autoinit 
kernel_code_template=""" 
__global__ void myfunction(float* inx, float* outy, float* outderiv) 
{ 
    //defining thread index 
    ... 
    //declare dependent and independet variables as adoubles 
    //this is a part of my question 
    adtl::adouble y[3]; 
    adtl::adouble x[3]; 
    // ... 
} 
""" 

... यह सिर्फ एक विचार है, लेकिन SourceModule पता नहीं होगा क्या कर रहे हैं "adouble के", क्योंकि वे वर्ग परिभाषा adoublecuda.h में परिभाषित कर रहे हैं, इसलिए मैं आशा है कि अब आप मेरे प्रश्न को बेहतर समझेंगे। क्या किसी के पास कोई सुराग है जहां मुझे शुरू करना चाहिए? यदि नहीं, तो मैं इस कर्नल्स को CUDA-C में लिखूंगा, और nvcc -cubin विकल्प का उपयोग करूंगा।

मदद के लिए धन्यवाद!

उत्तर

6

पीईसीयूडीए स्रोत मॉड्यूल सिस्टम वास्तव में आपके द्वारा फ़ाइल में पास किए गए कोड को प्राप्त करने का एक तरीका है, उस फ़ाइल को nvcc के साथ एक क्यूबिन फ़ाइल में संकलित करना, और (वैकल्पिक रूप से) वर्तमान क्यूडीए संदर्भ में उस क्यूबिन फ़ाइल को लोड करना। पीईसीयूडीए कंपाइलर मॉड्यूल सीयूडीए कर्नेल सिंटैक्स या कोड के बारे में बिल्कुल कुछ नहीं जानता है, और संकलित किए गए कोड पर लगभग (लगभग) कोई प्रभाव नहीं है [लगभग क्वालीफायर है क्योंकि यहसी ++ प्रतीक मैंगलिंग रोकने के लिए उपयोगकर्ता द्वारा सबमिट कोड को ब्रैकेट कर सकता है]।

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

from pycuda import driver, gpuarray 
from pycuda.compiler import SourceModule 
import pycuda.autoinit 
kernel_code_template=""" 

#include "adoublecuda.h" 
__global__ void myfunction(float* inx, float* outy, float* outderiv) 
{ 
    //defining thread index 
    ... 
    //declare dependent and independet variables as adoubles 
    //this is a part of my question 
    adtl::adouble y[3]; 
    adtl::adouble x[3]; 
    // ... 
} 

""" 

module = SourceModule(kernel_code_template, include_dirs=['path/to/adoublecuda']) 

और यह पूर्ण रूप से अपने काम करना चाहिए (नोट अपरीक्षित, अपने जोखिम पर उपयोग करें)।

+0

वाह, यही वह समाधान है जिसे मैं ढूंढ रहा था! मैं बस इस हेडर फ़ाइल को शामिल करना चाहता था, ताकि मेरे कर्नल को पता चले कि एडबेल क्लास की परिभाषा कहां है, लेकिन मुझे नहीं पता था कि कैसे। मैं इस "डबल" के अंदर इस दोहरी कक्षा का उपयोग नहीं करूंगा, लेकिन मुझे यह पता लगाने की आवश्यकता होगी कि gpu से यह एडोब सरणी कैसे प्राप्त करें। जैसा कि आप देख सकते हैं, एडबेल क्लास में केवल दो निजी सदस्य हैं: 'डबल वैल' 'डबल एडवल' शायद मुझे इसी तरह के पायथन में एक स्ट्रक्चर बनाने की आवश्यकता होगी। मेरी मदद करने के लिए बहुत बहुत धन्यवाद! – Banana

+0

जब मैं इस कक्षा को शामिल करने का प्रयास करता हूं तो मुझे बहुत अधिक त्रुटियां मिलती हैं: "इस घोषणा में बाहरी" सी "लिंकेज नहीं हो सकता है। क्या मुझे adoublecuda.h बदलने की ज़रूरत है या कुछ और है? – Banana

+0

जैसा कि मैंने अपने उत्तर में उल्लेख किया है, SourceModule कोड 'तार' को 'बाहरी "सी" {} 'घोषणा के साथ ब्रैकेट कर सकता है। आपके कोड में शुद्ध सी ++ परिभाषाओं के साथ, आप इसे नहीं चाहते हैं। आप उस व्यवहार को 'no_extern_c = True' कीवर्ड तर्क के साथ अक्षम कर सकते हैं। आउटपुट में प्रतीक उलझन में होगा, आपको इसे अपने पायथन कोड में accounnt में ले जाने की आवश्यकता हो सकती है। इस समय परीक्षण करने के लिए मेरे पास एक पिक्यूडा इंस्टॉलेशन नहीं है। – talonmies