علوم وفضاء

may_share_memory: هل True تثبت عنصرًا مشتركًا؟

فهارس مختلفة وحدان متداخلان.
A وB: حدود متداخلة دون بايت عنصر مشترك.

في مثالنا، تداخل حدّا شريحتين دون بايت عنصر مشترك.

اقرأ True بوصفها احتمالًا

النتيجة True لا تثبت عنصرًا مشتركًا؛ الفحص الافتراضي ينظر إلى الحدود. [1]

سؤالنا محدد: هل يكفي تداخل المدى المحيط بعناصر شريحتين لوجود بايت عنصر يستعمله الطرفان؟ نفصل بين المدى وبين مواضع العناصر التي اخترناها داخله.

توثق shares_memory معيار الاشتراك الفعلي، مع الفحص الدقيق الافتراضي. [2]

استدعينا الدالتين دون max_work في الأمثلة التالية. لا نقارن سرعة الدالتين ولا نغير خياراتهما. ننسب النتائج العددية والبايتات المعروضة إلى التشغيل المسجل، ولا نستعير الأمثلة العددية من الوثائق.

القيم مؤلفة لتسهيل تتبع مواضعها؛ ليست بيانات قياس. وجود قيم مختلفة أو متساوية لا يقوم مقام فحص المواضع في مرجعنا.

مجموعتان منفصلتان داخل حدين متداخلين

في NumPy 2.3.5 على CPython 3.12.14، أنشأنا X=np.array([13,-5,8,2,-7,4,9,-3,6,-1,10],dtype=np.int64). شكل القاعدة (11,)، وحجم العنصر المقروء 8 بايتات.

A=X[::3] اختارت فهارس القاعدة 0 و3 و6 و9؛ قيمها [13,2,9,-1]. أما B=X[1::3] فاختارت 1 و4 و7 و10؛ قيمها [-5,-7,-3,10]. لكل شريحة الشكل (4,) وخطوة مقدارها 24 بايتًا.

نحسب الإزاحات نسبة إلى بداية بيانات X، ولا ننشر عنوان ذاكرة خامًا. بايتات عناصر A تقع في [0,8) و[24,32) و[48,56) و[72,80). بايتات عناصر B تقع في [8,16) و[32,40) و[56,64) و[80,88).

كل مجال هنا نصف مفتوح: نضم البداية ونستبعد النهاية. لذلك [0,8) و[8,16) متجاوران دون بايت مشترك. بتطبيق ذلك على المجالات الأربعة لكل شريحة، يكون تقاطع مجموعتي بايتات العناصر فارغًا.

الحد المحيط بـA هو [0,80)، وبـB هو [8,88). يتقاطع الحدّان في [8,80)، لكن هذا التقاطع يضم فجوات بين عناصر كل شريحة. لا تصبح الفجوة عنصرًا في A لمجرد وقوعها بين أول عنصر وآخره.

أعطى np.may_share_memory(A,B) النتيجة True، بينما أعطى np.shares_memory(A,B) النتيجة False. اتفقت النتيجتان مع مرجع الحدود ومرجع مجموعات البايتات على الترتيب؛ اختلافهما هو نتيجة المثال الذي أردنا تفسيره.

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

عنصر مشترك ونسخة وتجربة كتابة

أنشأنا C=X[3:10:3] من القاعدة نفسها. فهارسها 3 و6 و9، وقيمها [2,9,-1] قبل الكتابة، وشكلها (3,). الخطوة 24 بايتًا، والحد النسبي [24,80).

هذه المرة توجد بايتات عناصر مشتركة مع A: الإزاحات 24 إلى 31، و48 إلى 55، و72 إلى 79. أعطى كل من may_share_memory(A,C) وshares_memory(A,C) النتيجة True؛ لم نعتمد على تداخل الحدين وحده.

قبل الكتابة، أنشأنا N=np.array(A,copy=True). كانت قيم N هي [13,2,9,-1] ونوعها int64 وشكلها (4,). أعطى الفحصان للزوج A,N النتيجة False في التشغيل.

ثم نفذنا A[1]=100. موضع الشريحة 1 يقابل فهرس القاعدة 3. أصبحت A تساوي [13,100,9,-1]، وأصبحت C تساوي [100,9,-1]. في X تغير العنصر ذي الفهرس 3 من 2 إلى 100.

بقيت B تساوي [-5,-7,-3,10] وبقيت N تساوي [13,2,9,-1]؛ تحققنا من ثبات بايتاتهما. هذه الكتابة تثبت الأثر المسجل على الموضع المشترك، ولا تحول True للزوج A,B إلى دليل على عنصر مشترك.

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

نتائج التحكم قبل الكتابة وبعدها.
الكتابة غيرت A وC؛ بقيت B والنسخة ثابتتين.

مرجع البايتات ونطاق الأدلة

بنى مرجع Python فهارس كل شريحة باستعمال range(start,stop,step). لكل فهرس k جمع الإزاحات من 8k إلى 8k+7، ثم قارن مجموعتي الإزاحات بتقاطع المجموعات.

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

لا يستدعي المرجع shares_memory أو may_share_memory أو دالة حدود من NumPy. راجعنا الإزاحة الابتدائية والخطوة الفعليتين بصورة منفصلة، نسبة إلى بداية القاعدة.

في الشبكة، استعملنا قواعد متصلة int64 بأطوال n من 1 إلى 12، وقيمة الفهرس k هي k−4. لكل قاعدة أخذنا بدايات من صفر إلى n−1 وخطوات من 1 إلى 4. الشرائح غير فارغة وتمتد إلى نهاية القاعدة.

يوجد 4n اختيارًا للشريحة، و(4n)² زوج مرتب لكل قاعدة. جمع الأزواج عبر الأطوال الاثني عشر أعطى 10400؛ شمل الزوج المرتب مقارنة الشريحة بنفسها أيضًا.

لكل زوج أربعة فحوص: القيم والنوع والشكل؛ والاشتراك الدقيق مقابل مرجع البايتات؛ والاحتمال مقابل مرجع الحدود مع تحقق أن الاشتراك الدقيق يستلزم التداخل؛ والإزاحات والخطوات وثبات بايتات القاعدة.

أضفنا ثمانية فحوص للزوج الرئيسي والتحكم المشترك، وفحصين للنسخة، وفحصين للكتابة، وفحصًا لحجم العنصر. الحساب 10400×4+8+2+2+1=41613، ومرت جميعها.

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

عند تفسير هذه التجربة، احتفظ بثلاثة سجلات: فهارس العناصر، والبايتات المستخدمة، والحد المحيط بها. السجل الثالث وحده لا يجيب عن وجود بايت عنصر مشترك في الزوج A,B.

الزوج قبل الكتابةmay_share_memoryshares_memory
A,BTrueFalse
A,CTrueTrue
A,NFalseFalse

للتوسع: عد العناصر والتخزين المشترك.

المراجع

  1. NumPy 2.3 — may_share_memory
  2. NumPy 2.3 — shares_memory

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