أمثلة | جودبولت | التوثيق |
---|
Thrust هي مكتبة خوارزميات C++ المتوازية التي ألهمت إدخال الخوارزميات المتوازية إلى مكتبة C++ القياسية. تعمل واجهة Thrust عالية المستوى على تحسين إنتاجية المبرمج بشكل كبير مع تمكين إمكانية نقل الأداء بين وحدات معالجة الرسومات ووحدات المعالجة المركزية متعددة النواة. إنه يعتمد على أطر البرمجة الموازية المعمول بها (مثل CUDA وTBB وOpenMP). كما يوفر أيضًا عددًا من المرافق ذات الأغراض العامة المشابهة لتلك الموجودة في مكتبة C++ القياسية.
مكتبة NVIDIA C++ القياسية هي مشروع مفتوح المصدر؛ إنه متوفر على GitHub ومضمن في NVIDIA HPC SDK وCUDA Toolkit. إذا كان لديك أحد حزم SDK مثبتة، فلن تكون هناك حاجة إلى تثبيت إضافي أو إشارات مترجم لاستخدام libcu++.
من الأفضل تعلم الدفع من خلال الأمثلة.
يقوم المثال التالي بإنشاء أرقام عشوائية بشكل تسلسلي ثم نقلها إلى جهاز موازي حيث يتم فرزها.
# include < thrust/host_vector.h >
# include < thrust/device_vector.h >
# include < thrust/generate.h >
# include < thrust/sort.h >
# include < thrust/copy.h >
# include < thrust/random.h >
int main () {
// Generate 32M random numbers serially.
thrust::default_random_engine rng ( 1337 );
thrust::uniform_int_distribution< int > dist;
thrust::host_vector< int > h_vec ( 32 << 20 );
thrust::generate (h_vec. begin (), h_vec. end (), [&] { return dist (rng); });
// Transfer data to the device.
thrust::device_vector< int > d_vec = h_vec;
// Sort data on the device.
thrust::sort (d_vec. begin (), d_vec. end ());
// Transfer data back to host.
thrust::copy (d_vec. begin (), d_vec. end (), h_vec. begin ());
}
شاهده على Godbolt
يوضح هذا المثال حساب مجموع بعض الأرقام العشوائية الموازية:
# include < thrust/host_vector.h >
# include < thrust/device_vector.h >
# include < thrust/generate.h >
# include < thrust/reduce.h >
# include < thrust/functional.h >
# include < thrust/random.h >
int main () {
// Generate random data serially.
thrust::default_random_engine rng ( 1337 );
thrust::uniform_real_distribution< double > dist (- 50.0 , 50.0 );
thrust::host_vector< double > h_vec ( 32 << 20 );
thrust::generate (h_vec. begin (), h_vec. end (), [&] { return dist (rng); });
// Transfer to device and compute the sum.
thrust::device_vector< double > d_vec = h_vec;
double x = thrust::reduce (d_vec. begin (), d_vec. end (), 0 , thrust::plus< int >());
}
شاهده على Godbolt
يوضح هذا المثال كيفية إجراء هذا التخفيض بشكل غير متزامن:
# include < thrust/host_vector.h >
# include < thrust/device_vector.h >
# include < thrust/generate.h >
# include < thrust/async/copy.h >
# include < thrust/async/reduce.h >
# include < thrust/functional.h >
# include < thrust/random.h >
# include < numeric >
int main () {
// Generate 32M random numbers serially.
thrust::default_random_engine rng ( 123456 );
thrust::uniform_real_distribution< double > dist (- 50.0 , 50.0 );
thrust::host_vector< double > h_vec ( 32 << 20 );
thrust::generate (h_vec. begin (), h_vec. end (), [&] { return dist (rng); });
// Asynchronously transfer to the device.
thrust::device_vector< double > d_vec (h_vec. size ());
thrust::device_event e = thrust::async::copy (h_vec. begin (), h_vec. end (),
d_vec. begin ());
// After the transfer completes, asynchronously compute the sum on the device.
thrust::device_future< double > f0 = thrust::async::reduce (thrust::device. after (e),
d_vec. begin (), d_vec. end (),
0.0 , thrust::plus< double >());
// While the sum is being computed on the device, compute the sum serially on
// the host.
double f1 = std::accumulate (h_vec. begin (), h_vec. end (), 0.0 , thrust::plus< double >());
}
شاهده على Godbolt
التوجه هو مكتبة رأسية فقط؛ ليست هناك حاجة لبناء المشروع أو تثبيته إلا إذا كنت ترغب في تشغيل اختبارات وحدة الدفع.
توفر مجموعة أدوات CUDA إصدارًا حديثًا من كود مصدر Thrust في include/thrust
. سيكون هذا مناسبًا لمعظم المستخدمين.
يجب على المستخدمين الذين يرغبون في المساهمة في Thrust أو تجربة ميزات أحدث استنساخ مستودع Thrust Github بشكل متكرر:
git clone --recursive https://github.com/NVIDIA/thrust.git
بالنسبة للمشاريع القائمة على CMake، فإننا نوفر حزمة CMake للاستخدام مع find_package
. راجع الملف التمهيدي لـ CMake لمزيد من المعلومات. يمكن أيضًا إضافة الدفع عبر add_subdirectory
أو أدوات مثل CMake Package Manager.
بالنسبة للمشاريع غير التابعة لـ CMake، قم بالتجميع باستخدام:
-I<thrust repo root>
)-I<thrust repo root>/dependencies/libcudacxx/
)-I<thrust repo root>/dependencies/cub/
)-DTHRUST_HOST_SYSTEM=THRUST_HOST_SYSTEM_XXX
، حيث XXX
هو CPP
(تسلسلي، افتراضي)، OMP
(OpenMP)، أو TBB
(Intel TBB)-DTHRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_XXX
، حيث XXX
هو CPP
أو OMP
أو TBB
أو CUDA
(افتراضي). يستخدم Thrust نظام البناء CMake لبناء اختبارات الوحدة والأمثلة واختبارات الرأس. لبناء Thrust كمطور، يوصى باستخدام نظام التطوير المعبأ الخاص بنا:
# Clone Thrust and CUB repos recursively:
git clone --recursive https://github.com/NVIDIA/thrust.git
cd thrust
# Build and run tests and examples:
ci/local/build.bash
يؤدي ذلك إلى ما يعادل ما يلي، ولكن في بيئة حاوية نظيفة تم تثبيت جميع التبعيات فيها:
# Clone Thrust and CUB repos recursively:
git clone --recursive https://github.com/NVIDIA/thrust.git
cd thrust
# Create build directory:
mkdir build
cd build
# Configure -- use one of the following:
cmake .. # Command line interface.
ccmake .. # ncurses GUI (Linux only).
cmake-gui # Graphical UI, set source/build directories in the app.
# Build:
cmake --build . -j ${NUM_JOBS} # Invokes make (or ninja, etc).
# Run tests and examples:
ctest
افتراضيًا، يتم استخدام نظام مضيف CPP
تسلسلي ونظام الجهاز المسرع CUDA
ومعيار C++ 14. يمكن تغيير ذلك في CMake وعبر الإشارات إلى ci/local/build.bash
يمكن العثور على مزيد من المعلومات حول تكوين بناء Thrust الخاص بك وإنشاء طلب سحب في قسم المساهمة.
Thrust هو مشروع مفتوح المصدر تم تطويره على GitHub. يتم توزيع الدفع بموجب ترخيص Apache v2.0 مع استثناءات LLVM؛ يتم توزيع بعض الأجزاء بموجب ترخيص Apache v2.0 وترخيص Boost v1.0.