| دليل المساهم | حاويات ديف | خلاف | Godbolt | مشروع جيثب | الوثائق |
|---|
مرحبًا بك في مكتبات CUDA Core Compute (CCCL) حيث تتمثل مهمتنا في جعل CUDA أكثر سارة.
يوحد هذا المستودع ثلاث مكتبات Cuda C ++ الأساسية في مستودع واحد مريح:
الهدف من CCCL هو تزويد مطوري CUDA C ++ مع لبنات بناء تجعل من السهل كتابة رمز آمن وفعال. يجمع هذه المكتبات معًا عملية التطوير وتوسيع قدرتك على الاستفادة من قوة CUDA C ++. لمزيد من المعلومات حول قرار توحيد هذه المشاريع ، راجع الإعلان هنا.
نما مفهوم مكتبات CUDA Core Compute (CCCL) من الناحية العضوية من المشاريع ، و Cub ، و Libcudacxx التي تم تطويرها بشكل مستقل على مر السنين بهدف مماثل: توفير ملخصات عالية الجودة وعالية الأداء وسهل الاستخدام لمطوري CUDA. وبطبيعة الحال ، كان هناك الكثير من التداخل بين المشاريع الثلاثة ، وأصبح من الواضح أن المجتمع سيخدم بشكل أفضل من خلال توحيدهم في مستودع واحد.
الدفع هي مكتبة الخوارزميات المتوازية C ++ التي ألهمت إدخال خوارزميات متوازية إلى مكتبة C ++ القياسية. تعزز الواجهة العالية للمستوى العالي بشكل كبير إنتاجية المبرمج مع تمكين قابلية نقل الأداء بين وحدات معالجة الرسومات وحدات المعالجة المركزية متعددة الأوساط عبر الخلفية القابلة للتكوين التي تسمح باستخدام أطر برمجة متوازية متعددة (مثل CUDA و TBB و OPENMP).
Cub عبارة عن مكتبة ذات مستوى أدنى ، مكتبة CUDA محددة مصممة لخوارزميات متوازية سرعة الضوء عبر جميع بنيات GPU. بالإضافة إلى الخوارزميات على مستوى الجهاز ، فإنه يوفر خوارزميات تعاونية مثل التخفيض على مستوى الكتلة والمسح الضوئي على مستوى الالتفاف ، مما يوفر مطوري kernel Cuda مع لبنات بناء لإنشاء نواة مخصصة للسرعة.
libcudacxx هي مكتبة Cuda C ++ القياسية. يوفر تنفيذ مكتبة C ++ القياسية التي تعمل في كل من الرمز المضيف ورمز الجهاز. بالإضافة إلى ذلك ، فإنه يوفر تجريدات لميزات الأجهزة الخاصة بـ CUDA مثل بدائل التزامن ، والتحكم في ذاكرة التخزين المؤقت ، والذات ، وأكثر من ذلك.
الهدف الرئيسي من CCCL هو ملء دور مماثل تملأ مكتبة C ++ القياسية لـ C ++ القياسية: توفير أدوات متعددة الأغراض العامة للمطورين للمطورين Cuda C ++ ، مما يسمح لهم بالتركيز على حل المشكلات المهمة. توحيد هذه المشاريع هو الخطوة الأولى نحو تحقيق هذا الهدف.
هذا مثال بسيط يوضح استخدام وظائف CCCL من الدفع ، الشبل ، و libcudacxx.
يوضح كيفية استخدام الدفع/الشبل/libcudacxx لتنفيذ نواة تخفيض موازية بسيطة. تحسب كل كتلة مؤشر ترابط مجموع مجموعة فرعية من الصفيف باستخدام cub::BlockReduce . ثم يتم تقليل مجموع كل كتلة إلى قيمة واحدة باستخدام إضافة ذرية عبر cuda::atomic_ref من libcudacxx.
ثم يوضح كيف يمكن إجراء نفس التخفيض باستخدام خوارزمية reduce Thrust ومقارنة النتائج.
جربها على العيش على Godbolt!
# include < thrust/execution_policy.h >
# include < thrust/device_vector.h >
# include < cub/block/block_reduce.cuh >
# include < cuda/atomic >
# include < cuda/cmath >
# include < cuda/std/span >
# include < cstdio >
template < int block_size>
__global__ void reduce (cuda::std::span< int const > data, cuda::std::span< int > result) {
using BlockReduce = cub::BlockReduce< int , block_size>;
__shared__ typename BlockReduce::TempStorage temp_storage;
int const index = threadIdx. x + blockIdx. x * blockDim. x ;
int sum = 0 ;
if ( index < data. size ()) {
sum += data[ index ];
}
sum = BlockReduce (temp_storage). Sum (sum);
if (threadIdx. x == 0 ) {
cuda::atomic_ref< int , cuda::thread_scope_device> atomic_result (result. front ());
atomic_result. fetch_add (sum, cuda::memory_order_relaxed);
}
}
int main () {
// Allocate and initialize input data
int const N = 1000 ;
thrust::device_vector< int > data (N);
thrust::fill (data. begin (), data. end (), 1 );
// Allocate output data
thrust::device_vector< int > kernel_result ( 1 );
// Compute the sum reduction of `data` using a custom kernel
constexpr int block_size = 256 ;
int const num_blocks = cuda::ceil_div (N, block_size);
reduce<block_size><<<num_blocks, block_size>>>(cuda::std::span< int const >( thrust::raw_pointer_cast (data. data ()), data. size ()),
cuda::std::span< int >( thrust::raw_pointer_cast (kernel_result. data ()), 1 ));
auto const err = cudaDeviceSynchronize ();
if (err != cudaSuccess) {
std::cout << " Error: " << cudaGetErrorString (err) << std::endl;
return - 1 ;
}
int const custom_result = kernel_result[ 0 ];
// Compute the same sum reduction using Thrust
int const thrust_result = thrust::reduce (thrust::device, data. begin (), data. end (), 0 );
// Ensure the two solutions are identical
std::printf ( " Custom kernel sum: %d n " , custom_result);
std::printf ( " Thrust reduce sum: %d n " , thrust_result);
assert (kernel_result[ 0 ] == thrust_result);
return 0 ;
}كل شيء في CCCL هو رأس فقط. لذلك ، لا يحتاج المستخدمون إلى القلق فقط مع كيفية حصولهم على ملفات الرأس وكيفية دمجها في نظام البناء الخاص بهم.
أسهل طريقة للبدء في استخدام CCCL هي عبر مجموعة أدوات CUDA والتي تتضمن رؤوس CCCL. عندما تقوم بالتجميع باستخدام nvcc ، فإنه يضيف تلقائيًا رؤوس CCCL إلى مسار تضمينك حتى تتمكن من ببساطة #include أي رأس CCCL في الكود الخاص بك دون أي تكوين إضافي مطلوب.
إذا تم تجميعها مع برنامج مترجم آخر ، فستحتاج إلى تحديث نظام البحث في نظام البناء الخاص بك إلى الإشارة إلى رؤوس CCCL في تثبيت CTK الخاص بك (على سبيل المثال ، /usr/local/cuda/include ).
# include < thrust/device_vector.h >
# include < cub/cub.cuh >
# include < cuda/std/atomic > يتم تشجيع المستخدمين الذين يرغبون في البقاء في طليعة تطوير CCCL على استخدام CCCL من Github. يتم دعم إصدار أحدث من CCCL مع إصدار أقدم من مجموعة أدوات CUDA ، ولكن ليس العكس. للحصول على معلومات كاملة عن التوافق بين CCCL ومجموعة أدوات CUDA ، راجع دعم النظام الأساسي الخاص بنا.
كل شيء في CCCL هو رأس فقط ، لذا فإن الاستنساخ وإدراجه في مشروع بسيط سهل مثل ما يلي:
git clone https://github.com/NVIDIA/cccl.git
nvcc -Icccl/thrust -Icccl/libcudacxx/include -Icccl/cub main.cu -o mainلاحظ استخدام
-Iوليس-isystemلتجنب التصادمات مع رؤوس CCCL المدرجة ضمنيًا بواسطةnvccمن مجموعة أدوات CUDA. تستخدم جميع رؤوس CCCL#pragma system_headerلضمان إسكات التحذيرات كما لو كانت تستخدم-isystem، انظر #527 لمزيد من المعلومات.
يمكن تكوين الحد الأدنى من الإنشاء الذي لا ينشئ سوى قواعد التثبيت باستخدام install CMAKE المسبق:
git clone https://github.com/NVIDIA/cccl.git
cd cccl
cmake --preset install -DCMAKE_INSTALL_PREFIX=/usr/local/
cd build/install
ninja install لتضمين المكتبات التجريبية في التثبيت ، استخدم دليل التثبيت install-unstable والبناء.
لتثبيت المكتبات التجريبية فقط ، استخدم دليل install-unstable-only .
يوفر CCCL أيضًا حزم كوندا لكل إصدار عبر قناة conda-forge :
conda config --add channels conda-forge
conda install cccl سيؤدي ذلك إلى تثبيت أحدث CCCL على $CONDA_PREFIX/include/ $CONDA_PREFIX/lib/cmake/ الدلائل. يمكن اكتشافه بواسطة CMake عبر find_package(CCCL) ويمكن استخدامه من قبل أي مترجم في بيئة كوندا. لمزيد من المعلومات ، راجع هذه المقدمة إلى كوندا فورج.
إذا كنت ترغب في استخدام نفس إصدار CCCL الذي يتم شحنه باستخدام مجموعة أدوات CUDA معينة ، مثل CUDA 12.4 ، يمكنك تثبيت CCCL مع:
conda config --add channels conda-forge
conda install cuda-cccl cuda-version=12.4 يقوم cuda-cccl Metapackage بتثبيت إصدار cccl الذي يتم شحنه باستخدام مجموعة أدوات CUDA المقابلة لـ cuda-version . إذا كنت ترغب في التحديث إلى أحدث cccl بعد تثبيت cuda-cccl ، قم بإلغاء cuda-cccl قبل تحديث cccl :
conda uninstall cuda-cccl
conda install -c conda-forge ccclلاحظ أن هناك أيضًا حزم كوندا مع أسماء مثل
cuda-cccl_linux-64. تحتوي هذه الحزم على إصدارات CCCL التي يتم شحنها كجزء من مجموعة أدوات CUDA ، ولكنها مصممة للاستخدام الداخلي بواسطة مجموعة أدوات CUDA. قم بتثبيتccclأوcuda-ccclبدلاً من ذلك ، لتوافق مع المترجمين CENTA. لمزيد من المعلومات ، راجع وصفة CCCL Conda-Forge.
يستخدم CCCL CMAKE لجميع البنية التحتية للبناء والتركيب ، بما في ذلك الاختبارات وكذلك الأهداف للربط في مشاريع CMAKE الأخرى. لذلك ، CMake هي الطريقة الموصى بها لدمج CCCL في مشروع آخر.
للحصول على مثال كامل على كيفية القيام بذلك باستخدام Cmake Package Manager ، انظر مشروع المثال الأساسي الخاص بنا.
يجب أن تعمل أنظمة البناء الأخرى ، ولكن يتم اختبار cmake فقط. المساهمات في تبسيط دمج CCCL في أنظمة البناء الأخرى مرحب بها.
هل أنت مهتم بالمساهمة في جعل CCCL أفضل؟ تحقق من دليلنا المساهمين للحصول على نظرة عامة شاملة على كل ما تحتاج إلى معرفته لإعداد بيئة التطوير الخاصة بك ، وإجراء التغييرات ، وتشغيل الاختبارات ، وتقديم العلاقات العامة.
الهدف: يصف هذا القسم المكان الذي يمكن للمستخدمين توقعه لتجميع CCCL وتشغيله بنجاح.
بشكل عام ، يجب أن تعمل CCCL في كل مكان يتم دعم مجموعة أدوات CUDA ، ومع ذلك ، فإن الشيطان في التفاصيل. تصف الأقسام أدناه تفاصيل الدعم والاختبار للإصدارات المختلفة من مجموعة أدوات CUDA ، ومترجمات المضيف ، ولهجات C ++.
ملخص:
يتم تشجيع مستخدمي CCCL على الاستفادة من أحدث التحسينات و "Live at Head" من خلال استخدام أحدث إصدار من CCCL. لتجربة سلسة ، يمكنك ترقية CCCL بشكل مستقل عن مجموعة أدوات CUDA بأكملها. هذا ممكن لأن CCCL يحافظ على توافق متخلف مع أحدث إصدار تصحيح لكل إصدار CTK صغير من كل من سلسلة الإصدار الرئيسية الحالية والسابقة. في بعض الحالات الاستثنائية ، قد يكون الحد الأدنى للنسخة الثانوية المدعومة من إصدار مجموعة أدوات CUDA أحدث من أقدم إصدار ضمن سلسلة الإصدار الرئيسية. على سبيل المثال ، يتطلب CCCL إصدارًا مدعومًا أدنى من 11.1 من سلسلة 11.x بسبب مشكلة مترجم لا يمكن تجنبه في CTK 11.0.
عندما يتم إصدار CTK الرئيسية الجديدة ، فإننا نسقط الدعم لأقدم إصدار رئيسي مدعوم.
| نسخة CCCL | يدعم إصدار مجموعة أدوات CUDA |
|---|---|
| 2.x | 11.1 - 11.8 ، 12.x (أحدث إصدارات التصحيح فقط) |
| 3.x (المستقبل) | 12.x ، 13.x (أحدث إصدارات التصحيح فقط) |
يجب أن يتم تجميع الكود المميز باستخدام أحدث CCCL وتشغيله بنجاح مع أي إصدار مدعوم CTK. قد تحدث الاستثناءات للميزات الجديدة التي تعتمد على ميزات CTK الجديدة ، لذلك لن تعمل هذه الميزات على الإصدارات القديمة من CTK. على سبيل المثال ، لم تتم إضافة دعم C ++ 20 إلى nvcc حتى CUDA 12.0 ، لذلك فإن ميزات CCCL التي تعتمد على C ++ 20 لن تعمل مع CTK 11.x.
يمكن للمستخدمين دمج إصدار أحدث من CCCL في CTK أقدم ، ولكن ليس العكس. هذا يعني أن إصدارًا أقدم من CCCL غير متوافق مع CTK الأحدث. بمعنى آخر ، لا يتوافق CCCL أبدًا مع مجموعة أدوات CUDA.
يلخص الجدول أدناه توافق CTK و CCCL:
| نسخة CTK | وشملت نسخة CCCL | CCCL المطلوب | مدعوم؟ | ملحوظات |
|---|---|---|---|---|
CTK XY | CCCL MAJOR.MINOR | cccl MAJOR.MINOR+n | ✅ | قد لا تعمل بعض الميزات الجديدة |
CTK XY | CCCL MAJOR.MINOR | CCCL MAJOR+1.MINOR | ✅ | فترات راحة ممكنة قد لا تتوفر بعض الميزات الجديدة |
CTK XY | CCCL MAJOR.MINOR | CCCL MAJOR+2.MINOR | يدعم CCCL نسختين رئيسيتين فقط CTK | |
CTK XY | CCCL MAJOR.MINOR | CCCL MAJOR.MINOR-n | CCCL غير متوافق إلى الأمام | |
CTK XY | CCCL MAJOR.MINOR | CCCL MAJOR-n.MINOR | CCCL غير متوافق إلى الأمام |
لمزيد من المعلومات حول إصدار CCCL ، وتوافق API/ABI ، وتغيير التغييرات ، انظر قسم الإصدار أدناه.
ما لم ينص على خلاف ذلك ، تدعم CCCL جميع أنظمة التشغيل نفسها مثل مجموعة أدوات CUDA ، والتي تم توثيقها هنا:
ما لم ينص على خلاف ذلك ، يدعم CCCL نفس المترجمين المضيفين مثل أحدث مجموعة أدوات CUDA ، والتي تم توثيقها هنا:
عند استخدام مجموعات أدوات CUDA الأقدم ، فإننا ندعم أيضًا المترجمين المضيفين لأحدث مجموعة أدوات CUDA ، ولكن على الأقل آخر برنامج المترجم المضيف لأي مجموعة أدوات CUDA الأقدم المدعومة.
قد نحتفظ بدعم المترجمين الإضافيين وسنقبل البقع المقابلة من المجتمع بإصلاحات معقولة. لكننا لن نستثمر وقتًا كبيرًا في ثلاثية أو إصلاح المشكلات للمترجمين الأكبر سناً.
بروح "أنت تدعم فقط ما تختبره" ، انظر نظرة عامة على CI لمزيد من المعلومات حول ما نختبره بالضبط.
ما لم ينص على خلاف ذلك ، تدعم CCCL جميع هياكل GPU/إمكانات حساب GPU نفسها مثل مجموعة أدوات CUDA ، والتي تم توثيقها هنا: https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#compute-gapt
لاحظ أن بعض الميزات قد تدعم فقط بعض القدرات/القدرات.
تحدد استراتيجية اختبار CCCL توازنًا بين اختبار أكبر عدد ممكن من التكوينات والحفاظ على أوقات CI معقولة.
بالنسبة لإصدارات مجموعة أدوات CUDA ، يتم الاختبار مقابل كل من الأقدم وأحدث الإصدارات المدعومة. على سبيل المثال ، إذا كان الإصدار الأخير من مجموعة أدوات CUDA هو 12.3 ، فسيتم إجراء الاختبارات مقابل 11.1 و 12.3. لكل إصدار من CUDA ، يتم الانتهاء من عمليات الإنشاء مقابل جميع المجمعين المضيف المدعوم مع جميع لهجات C ++ المدعومة.
استراتيجية الاختبار والمصفوفة تتطور باستمرار. المصفوفة المحددة في ملف ci/matrix.yaml هو المصدر النهائي للحقيقة. لمزيد من المعلومات حول خط أنابيب CI الخاص بنا ، انظر هنا.
الهدف: يصف هذا القسم كيفية إصدار CCCL ، وضمان استقرار API/API ، وإرشادات التوافق لتقليل الصداع.
ملخص
cub:: أو thrust:: مساحات الأسماءcuda:: في أي وقت ، ولكن سوف تنعكس من خلال زيادة إصدار ABI الذي يتم تضمينه في مساحة اسم مضمنة لجميع الرموز cuda:: . يمكن دعم إصدارات ABI المتعددة بشكل متزامن.ملاحظة: قبل دمج الدفع ، الشبل ، و libcudacxx في هذا المستودع ، تم إصدار كل مكتبة بشكل مستقل وفقًا للإصدار الدلالي. بدءًا من الإصدار 2.1 ، قامت جميع المكتبات الثلاث بمزامنة إصدارات إطلاقها في مستودعاتها المنفصلة. المضي قدمًا ، سيستمر إصدار CCCL تحت إصدار دلالي واحد ، مع 2.2.0 هو الإصدار الأول من مستودع NVIDIA/CCCL.
إن التغيير الذي يتميز به التغيير هو تغيير في الوظائف المدعومة بشكل صريح بين الإصدارات التي تم إصدارها والتي تتطلب من المستخدم القيام بعمل من أجل الترقية إلى الإصدار الأحدث.
في الحد الأقصى ، فإن أي تغيير لديه القدرة على كسر شخص ما في مكان ما. ونتيجة لذلك ، لا تعتبر كل التغييرات المحتملة في كسر المصدر تنقسم تغييرات على واجهة برمجة التطبيقات العامة التي تضمن تصوير النسخة الدلالية الرئيسية.
تصف الأقسام أدناه تفاصيل كسر التغييرات في API من CCCL و ABI.
واجهة برمجة تطبيقات CCCL العامة هي مجمل الوظائف المعرضة عمدا لتوفير فائدة المكتبة.
بمعنى آخر ، تتجاوز واجهة برمجة التطبيقات العامة من CCCL توقيعات الوظائف وتتضمن (على سبيل المثال لا الحصر):
علاوة على ذلك ، لا يتضمن واجهة برمجة التطبيقات العامة من CCCL أي مما يلي:
_ أو __detail بما في ذلك detail:: مساحة الاسم أو الماكروdetail/ الدليل أو الدليل الفرعي منهبشكل عام ، الهدف هو تجنب كسر أي شيء في واجهة برمجة التطبيقات العامة. لا يتم إجراء مثل هذه التغييرات إلا إذا كانت توفر للمستخدمين أداءً أفضل ، وواجهة برمجة التطبيقات أسهل فهمها ، و/أو واجهات برمجة التطبيقات الأكثر اتساقًا.
أي تغيير في API العام سيتطلب رقم الإصدار الرئيسي لـ CCCL. تمشيا مع توافق الإصدار الصغرى CUDA ، لن تحدث تغييرات CCCL الرئيسية في الإصدار CCCL إلا مع إصدار إصدار رئيسي جديد من مجموعة أدوات CUDA.
أي شيء ليس جزءًا من واجهة برمجة التطبيقات العامة قد يتغير في أي وقت دون سابق إنذار.
تشترك واجهة برمجة التطبيقات العامة لجميع مكونات CCCL في نسخة دلالية موحدة من MAJOR.MINOR.PATCH .
يتم دعم الإصدار الذي تم إصداره مؤخرًا فقط. كقاعدة عامة ، لا يتم خلط الميزات وإصلاحات الأخطاء إلى الإصدار أو الفروع التي تم إصدارها مسبقًا.
الطريقة المفضلة للاستعلام عن الإصدار هي استخدام CCCL_[MAJOR/MINOR/PATCH_]VERSION كما هو موضح أدناه. من أجل التوافق مع الورق ، تتوفر تعريفات إصدار Thrust/Cub/LibCudacxxx وستكون دائمًا متسقة مع CCCL_VERSION . لاحظ أن الدفع/الشبل يستخدم مخطط MMMmmmpp في حين يستخدم CCCL و LIBCUDACXX MMMmmmppp .
| CCCL | libcudacxx | دفع | شبل | |
|---|---|---|---|---|
| رأس | <cuda/version> | <cuda/std/version> | <thrust/version.h> | <cub/version.h> |
| نسخة رئيسية | CCCL_MAJOR_VERSION | _LIBCUDACXX_CUDA_API_VERSION_MAJOR | THRUST_MAJOR_VERSION | CUB_MAJOR_VERSION |
| نسخة صغيرة | CCCL_MINOR_VERSION | _LIBCUDACXX_CUDA_API_VERSION_MINOR | THRUST_MINOR_VERSION | CUB_MINOR_VERSION |
| تصحيح/نسخة فرعية | CCCL_PATCH_VERSION | _LIBCUDACXX_CUDA_API_VERSION_PATCH | THRUST_SUBMINOR_VERSION | CUB_SUBMINOR_VERSION |
| نسخة متسلسلة | CCCL_VERSION (MMMmmmppp) | _LIBCUDACXX_CUDA_API_VERSION (MMMmmmppp) | THRUST_VERSION (MMMmmmpp) | CUB_VERSION (MMMmmmpp) |
الواجهة الثنائية التطبيق (ABI) هي مجموعة من القواعد لـ:
تشمل ABI المكتبة ، على سبيل المثال لا الحصر:
تغيير ABI هو أي تغيير يؤدي إلى تغيير في ABI لوظيفة أو نوع في واجهة برمجة التطبيقات العامة. على سبيل المثال ، يعد إضافة عضو جديد في البيانات إلى البنية تغييرًا في كسر ABI لأنه يغير حجم النوع.
في CCCL ، فإن الضمانات حول ABI هي كما يلي:
cub:: thrust::thrust:: and cub:: الرموز هياكل CUDA المستخدمة في التجميع. لذلك ، قد يكون thrust:: أو cub:: الرمز ABI مختلف إذا:-x cu ) مقابل مصدر C ++ ( -x cpp )cuda:: ABI في أي وقت. ومع ذلك ، قامت cuda:: بتضمين رقم إصدار ABI الذي يتم زيادة عند حدوث استراحة ABI. يمكن دعم إصدارات ABI المتعددة بشكل متزامن ، وبالتالي لدى المستخدمين خيار العودة إلى إصدار ABI السابق. لمزيد من المعلومات ، انظر هنا.من يجب أن يهتم بأبي؟
بشكل عام ، يحتاج مستخدمو CCCL فقط إلى القلق بشأن مشكلات ABI عند بناء أو استخدام قطعة أثرية ثنائية (مثل مكتبة مشتركة) تتضمن API بشكل مباشر أو غير مباشر أنواعًا توفرها CCCL.
على سبيل المثال ، ضع في اعتبارك ما إذا كان libA.so تم تصميمه باستخدام الإصدار CCCL X وتتضمن واجهة برمجة التطبيقات العامة وظيفة مثل:
void foo (cuda::std::optional< int >); إذا تم تجميع مكتبة أخرى ، libB.so ، باستخدام إصدار CCCL Y وتستخدم foo من libA.so ، فقد يفشل ذلك إذا كان هناك استراحة ABI بين الإصدار X و Y على عكس تغييرات كسر API ، عادةً ما لا تتطلب فواصل ABI تغييرات رمز وتتطلب فقط إعادة تجميع كل شيء لاستخدام إصدار ABI نفسه.
لمعرفة المزيد حول ABI ولماذا هو مهم ، انظر ما هو ABI ، وما الذي يجب أن يفعله C ++ حيال ذلك؟.
كما ذكر أعلاه ، لا تشكل كل التغييرات الممكنة في كسر المصادر تغييرًا في كسر رقم الإصدار الرئيسي لـ CCCL.
يتم تشجيع المستخدمين على الالتزام بالمبادئ التوجيهية التالية من أجل تقليل خطر الاضطرابات عن طريق الخطأ اعتمادًا على أجزاء من CCCL التي ليست جزءًا من واجهة برمجة التطبيقات العامة:
thrust:: ، cub:: ، nv:: ، أو cuda:: مساحات الأسماء ما لم يتم ملاحظة استثناء لرمز محدد ، على سبيل المثال ، cuda::std::iterator_traitsthrust:: ، cub:: ، cuda:: ، أو nv:: مساحات الأسماء.nv:: cuda:: واجهة برمجة تطبيقات cub:: thrust::_ أو __ أو مع detail في أي مكان باسمه بما في ذلك detail:: مساحة الاسم أو الماكرو#include ملف الرأس مباشرة والذي يعلن هذا الرمز. وبعبارة أخرى ، لا تعتمد على الرؤوس ضمنية رؤوس أخرى.كانت أجزاء من هذا القسم مستوحاة من إرشادات توافق Abseil.
سنبذل قصارى جهدنا لإخطار المستخدمين قبل إجراء أي تغييرات كسر في واجهة برمجة التطبيقات العامة أو ABI أو تعديل المنصات والمجموعات المدعومة.
حسب الاقتضاء ، ستأتي الانخفاضات في شكل تحذيرات برمجية يمكن تعطيلها.
تعتمد فترة الإهمال على تأثير التغيير ، ولكن عادةً ما تستمر على الأقل إصدارين من الإصدار البسيط.
قريباً!
للحصول على نظرة عامة مفصلة على خط أنابيب CI ، انظر Ci-Overview.md.
المشاريع المرتبطة بمهمة CCCL لجعل كودا أكثر سارة:
هل يستخدم مشروعك CCCL؟ افتح العلاقات العامة لإضافة مشروعك إلى هذه القائمة!