سؤال

بدأت استخدام CUDA في هذه اللحظة و يجب أن أعترف أنني قليلا بخيبة أمل مع C API.أنا أفهم أسباب اختيار ج ولكن اللغة كانت على أساس C++ بدلا من عدة جوانب كانت أبسط كثيرا, على سبيل المثالالجهاز تخصيص الذاكرة (عبر cudaMalloc).

كانت خطتي ان افعل هذا بنفسي باستخدام طاقتها operator new مع وضع new و RAII (خيارين).أنا أتساءل إذا كان هناك أي المحاذير التي لم ألاحظ حتى الآن.رمز يبدو إلى العمل ولكن ما زلت أتساءل عن إمكانية تسرب الذاكرة.

استخدام RAII الكود سيكون على النحو التالي:

CudaArray<float> device_data(SIZE);
// Use `device_data` as if it were a raw pointer.

ربما فئة مبالغة في هذا السياق (وخاصة منذ كنت لا تزال لديك لاستخدام cudaMemcpy, الفئة فقط تغليف RAII) حتى ذلك النهج التنسيب new:

float* device_data = new (cudaDevice) float[SIZE];
// Use `device_data` …
operator delete [](device_data, cudaDevice);

هنا ، cudaDevice كمجرد الوسم لتحريك الزائد.ومع ذلك, منذ ذلك الحين في وضع العادي new وهذا يشير إلى موضع ، أجد جملة الغريب متسقة وربما من الأفضل استخدام فئة.

أنا أقدر الانتقادات من كل نوع.لا أحد ربما أعرف إذا كان هناك شيء في هذا الاتجاه ومن المقرر النسخة المقبلة من CUDA (الذي كما سمعت من شأنها تحسين دعم C++, كل ما يعني ذلك).

لذا سؤالي هو في الواقع ثلاثة محاور:

  1. هو وضع new الزائد لغويا صحيحة ؟ هل تسرب الذاكرة ؟
  2. هل لدى أحدكم معلومات عن المستقبل CUDA التطورات التي تذهب في هذا الاتجاه العام (دعونا نواجه الأمر:ج واجهات في C++ s*ck)?
  3. كيف يمكن لي أن أعتبر هذا بطريقة متسقة (هناك واجهات برمجة التطبيقات الأخرى على النظر في مثلليس هناك فقط ذاكرة الجهاز ولكن أيضا ثابت مخزن الذاكرة و نسيج الذاكرة)?

// Singleton tag for CUDA device memory placement.
struct CudaDevice {
    static CudaDevice const& get() { return instance; }
private:
    static CudaDevice const instance;
    CudaDevice() { }
    CudaDevice(CudaDevice const&);
    CudaDevice& operator =(CudaDevice const&);
} const& cudaDevice = CudaDevice::get();

CudaDevice const CudaDevice::instance;

inline void* operator new [](std::size_t nbytes, CudaDevice const&) {
    void* ret;
    cudaMalloc(&ret, nbytes);
    return ret;
}

inline void operator delete [](void* p, CudaDevice const&) throw() {
    cudaFree(p);
}

template <typename T>
class CudaArray {
public:
    explicit
    CudaArray(std::size_t size) : size(size), data(new (cudaDevice) T[size]) { }

    operator T* () { return data; }

    ~CudaArray() {
        operator delete [](data, cudaDevice);
    }

private:
    std::size_t const size;
    T* const data;

    CudaArray(CudaArray const&);
    CudaArray& operator =(CudaArray const&);
};

عن المفرد المستخدمة هنا:نعم أنا على علم من عيوبه.بيد أن هذه ليست ذات صلة في هذا السياق.كل ما أحتاجه هنا كان صغير نوع العلامة التي لم يكن copyable.كل شيء آخر (أيخاصية تعدد الاعتبارات وقت التهيئة) لا تنطبق.

هل كانت مفيدة؟

المحلول

وأود أن تذهب مع وضع نهج جديد.ثم أود أن تحديد الدرجة التي تتوافق مع std::مخصص<> واجهة.من الناحية النظرية ، يمكن تمرير هذه الفئة كقالب المعلمة في std::ناقلات<> و std::خريطة<> وهكذا دواليك.

حذار ، لقد سمعت أن تفعل مثل هذه الأشياء محفوف الصعوبة ، ولكن على الأقل سوف تتعلم الكثير عن المحكمة الخاصة بلبنان هذا الطريق.وأنت لا تحتاج إلى إعادة اختراع الحاويات الخاصة بك و الخوارزميات.

نصائح أخرى

في هذه الأثناء كانت هناك بعض التطورات الأخرى (وليس ذلك بكثير من حيث CUDA API, ولكن على الأقل من حيث مشاريع محاولة STL-نهج مثل CUDA إدارة البيانات).

أبرزها هناك مشروع من NVIDIA البحث: التوجه

هل لدى أحدكم معلومات عن المستقبل CUDA التطورات التي تذهب في هذا الاتجاه العام (دعونا نواجه الأمر:ج واجهات في C++ s*ck)?

نعم, لقد فعلت شيئا مثل هذا:

https://github.com/eyalroz/cuda-api-wrappers/

نفيديا وقت التشغيل API CUDA للاستخدام سواء في C و C++ code.كما أنه يستخدم الطراز C API ، وانخفاض القاسم المشترك (مع بعض الاستثناءات البارزة من قالب وظيفة الزائدة).

هذه المكتبة من الأغلفة حول التشغيل API هو السماح لنا لاحتضان العديد من الميزات C++ (بما في ذلك بعض C++11) استخدام وقت التشغيل API - ولكن دون التقليل من التعبيرية أو زيادة مستوى التجريد (كما في مثل التوجه المكتبة).باستخدام cuda-api-مغلفة, لا يزال لديك الخاص بك الأجهزة تيارات الأحداث وما إلى ذلك - ولكن سوف تكون أكثر ملاءمة للعمل في أكثر C++-الاصطلاحية الطرق.

هناك العديد من المشاريع التي تسعى شيئا من هذا القبيل, على سبيل المثال CUDPP.

في غضون ذلك, لقد نفذت بلدي مخصص و هو يعمل بشكل جيد و كانت واضحة (> 95% رمز المتداول).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top