মাল্টিকোর অ্যাসেম্বলি ভাষা দেখতে কেমন?


243

একসময়, x86 এসেম্বলার লিখতে, উদাহরণস্বরূপ, আপনার কাছে নির্দেশাবলী থাকবে যে "ইডিএক্স নিবন্ধটি 5 মান সহ লোড করুন", "ইডিএক্স ইনক্রিমেন্ট" রেজিস্ট্রার ইত্যাদি থাকবে।

আধুনিক সিপিইউগুলিতে 4 টি কোর (বা আরও বেশি) রয়েছে, মেশিন কোড স্তরে কি এটি দেখতে দেখতে 4 টি পৃথক সিপিইউ রয়েছে (অর্থাত্ কেবলমাত্র 4 টি স্বতন্ত্র "ইডিএক্স" রেজিস্ট্রার রয়েছে)? যদি তাই হয়, আপনি যখন "ইডিএক্স রেজিস্টার বাড়িয়ে দিন" বলবেন তখন কোন সিপিইউর ইডিএক্স নিবন্ধটি বাড়ানো হবে তা নির্ধারণ করে? X86 এসেম্বলারের এখন কি কোনও "সিপিইউ প্রসঙ্গ" বা "থ্রেড" ধারণা আছে?

কোরগুলির মধ্যে যোগাযোগ / সিঙ্ক্রোনাইজেশন কীভাবে কাজ করে?

আপনি যদি কোনও অপারেটিং সিস্টেম লেখেন, তবে আপনাকে বিভিন্ন কোরে মৃত্যুদন্ড কার্যকর করার সময়সূচী দেওয়ার জন্য হার্ডওয়্যারের মাধ্যমে কোন প্রক্রিয়াটি উদ্ভাসিত হয়? এটি কি কিছু বিশেষ ব্যক্তিগত নির্দেশ (গুলি)?

আপনি যদি কোনও মাল্টিকোর সিপিইউয়ের জন্য একটি অনুকূলিতকরণ সংকলক / বাইটকোড ভিএম লিখছিলেন, তবে আপনাকে সমস্ত কোরে দক্ষতার সাথে কার্যকরভাবে কোড তৈরি করার জন্য x86 সম্পর্কে বিশেষভাবে কী জানা দরকার?

মাল্টি-কোর কার্যকারিতা সমর্থন করার জন্য x86 মেশিন কোডে কি পরিবর্তন করা হয়েছে?


2
এখানে একটি অনুরূপ (যদিও অভিন্ন নয়) প্রশ্ন রয়েছে: স্ট্যাকওভারফ্লো
নাথান ফেলম্যান

উত্তর:


153

এটি প্রশ্নের সরাসরি উত্তর নয়, তবে এটি মন্তব্যে উপস্থিত একটি প্রশ্নের উত্তর। মূলত, প্রশ্নটি হল হার্ডওয়্যারটি মাল্টি থ্রেডেড অপারেশনকে কী সমর্থন করে।

নিকোলাস ফ্লাইন্টের ঠিক এটি ছিল , কমপক্ষে x86 সম্পর্কিত। একাধিক থ্রেডযুক্ত পরিবেশে (হাইপার-থ্রেডিং, মাল্টি-কোর বা মাল্টি-প্রসেসর) বুটস্ট্র্যাপ থ্রেড (সাধারণত প্রসেসরের 0 তে 0 0 তে থ্রেড) ঠিকানা থেকে কোড আনতে শুরু করে 0xfffffff0। অন্যান্য সমস্ত থ্রেডগুলি এসআইপিআই-এর জন্য অপেক্ষা করুন একটি বিশেষ ঘুমের রাজ্যে । এর সূচনার অংশ হিসাবে, প্রাথমিক থ্রেডটি ডাব্লুএফএসে থাকা প্রতিটি থ্রেডকে এসআইপিআই (স্টার্টআপ আইপিআই) নামে একটি এপিআইসি-র মাধ্যমে একটি বিশেষ আন্ত-প্রসেসর-ইন্টারপ্রেট (আইপিআই) প্রেরণ করে। এসআইপিআইতে এমন ঠিকানা রয়েছে যা থেকে সেই থ্রেডটি কোড আনতে শুরু করা উচিত।

এই প্রক্রিয়াটি প্রতিটি থ্রেডকে আলাদা ঠিকানা থেকে কোড চালানোর অনুমতি দেয়। প্রত্যেকটি থ্রেডের নিজস্ব টেবিল এবং বার্তাগুলির সারি স্থাপনের জন্য যা দরকার তা হল সফটওয়্যার সহায়তা। ওএস প্রকৃত মাল্টি-থ্রেড শিডিয়ুলিং করতে তাদের ব্যবহার করে

প্রকৃত সমাবেশের দিক থেকে নিকোলাস যেমন লিখেছেন, একক থ্রেডযুক্ত বা মাল্টি থ্রেড অ্যাপ্লিকেশনগুলির জন্য সমাবেশগুলির মধ্যে কোনও পার্থক্য নেই। প্রতিটি লজিকাল থ্রেডের নিজস্ব রেজিস্টার সেট থাকে, সুতরাং লিখিত:

mov edx, 0

শুধুমাত্র বর্তমানে চলমান থ্রেডেরEDX জন্য আপডেট হবে । একটি একক সমাবেশ নির্দেশ ব্যবহার করে অন্য কোনও প্রসেসরে পরিবর্তন করার কোনও উপায় নেই । ওএসকে কোডটি চালানোর জন্য অন্য থ্রেডকে বলার জন্য কিছু ধরণের সিস্টেম কল দরকার যা এটির নিজস্ব আপডেট হবে ।EDXEDX


2
নিকোলাসের উত্তরের ফাঁক পূরণ করার জন্য ধন্যবাদ আপনার এখন গ্রহণযোগ্য উত্তর হিসাবে চিহ্নিত করেছে .... আমার নির্দিষ্ট আগ্রহের বিশদ বিবরণ দেয় ... যদিও আপনার তথ্য এবং নিকোলাসের সম্মিলিত উত্তরগুলির একটি উত্তর থাকলে তা আরও ভাল।
পল হোলিংসওয়ার্থ

3
থ্রেডগুলি কোথা থেকে এসেছে তা প্রশ্নের উত্তর দেয় না। কোর এবং প্রসেসর একটি হার্ডওয়্যার জিনিস, তবে কোনওভাবে সফ্টওয়্যারে থ্রেড তৈরি করতে হবে। প্রাথমিক থ্রেড কীভাবে জানতে পারে কোথায় এসআইপিআই পাঠাতে হবে? নাকি এসআইপিআই নিজেই নতুন থ্রেড তৈরি করে?
সমৃদ্ধ পুনরায়

7
@ রিচরেমার: দেখে মনে হচ্ছে আপনি HW থ্রেড এবং SW থ্রেড গুলিয়ে ফেলছেন। এইচডাব্লু থ্রেড সর্বদা বিদ্যমান। মাঝে মাঝে ঘুমিয়ে পড়ে। এসআইপিআই নিজেই এইচডাব্লু থ্রেড জাগায় এবং এটি এসডাব্লু চালানোর অনুমতি দেয়। কোন এইচডাব্লু থ্রেডগুলি চালিত হয় এবং প্রতিটি এইচডাব্লু থ্রেডে কোন প্রসেস এবং এসডাব্লু থ্রেডগুলি চালিত হয় তা সিদ্ধান্ত নেওয়া ওএস এবং বিআইওএসের উপর নির্ভর করে।
নাথান ফেলম্যান

2
এখানে প্রচুর ভাল এবং সংক্ষিপ্ত তথ্য, তবে এটি একটি বড় বিষয় - সুতরাং প্রশ্নগুলি দীর্ঘায়িত হতে পারে। বন্য অঞ্চলে সম্পূর্ণ "নগ্ন হাড়" কার্নেলের কয়েকটি উদাহরণ রয়েছে যা ইউএসবি ড্রাইভ বা "ফ্লপি" ডিস্ক থেকে বুট করে - এখানে পুরানো টিএসএস বর্ণনাকারী ব্যবহার করে এসেম্বলারে লিখিত একটি x86_32 সংস্করণ রয়েছে যা আসলে মাল্টি-থ্রেডেড সি কোড চালাতে পারে ( গিথুব)। com / duanev / oz-x86-32-asm-003 ) তবে মানক গ্রন্থাগার সমর্থন নেই। আপনি যা চেয়েছিলেন তার চেয়ে খানিকটা বেশি তবে এটি সম্ভবত এই দীর্ঘতর প্রশ্নের কিছু উত্তর দিতে পারে।
duanev

87

ইন্টেল x86 ন্যূনতম চলমানযোগ্য খোলামেলা উদাহরণ

সমস্ত প্রয়োজনীয় বয়লারপ্লেট সহ চলমান বেয়ার ধাতব উদাহরণ । সমস্ত প্রধান অংশ নীচে আচ্ছাদিত করা হয়।

উবুন্টু 15.10 কিউএমইউ 2.3.0 এবং লেনোভো থিংকপ্যাড টি 400 আসল হার্ডওয়্যার অতিথির পরীক্ষিত ।

ইন্টেল ম্যানুয়াল ভলিউম 3 সিস্টেম প্রোগ্রামিং নির্দেশিকা - 325384-056US সেপ্টেম্বর 2015 অধ্যায়গুলির 8, 9 ও 10 কভার জন্য SMP।

সারণী 8-1। "ব্রডকাস্ট INIT-SIPI-SIPI সিকোয়েন্স এবং চয়েস অফ টাইমআউটস" এর একটি উদাহরণ রয়েছে যা মূলত স্রেফ কাজ করে:

MOV ESI, ICR_LOW    ; Load address of ICR low dword into ESI.
MOV EAX, 000C4500H  ; Load ICR encoding for broadcast INIT IPI
                    ; to all APs into EAX.
MOV [ESI], EAX      ; Broadcast INIT IPI to all APs
; 10-millisecond delay loop.
MOV EAX, 000C46XXH  ; Load ICR encoding for broadcast SIPI IP
                    ; to all APs into EAX, where xx is the vector computed in step 10.
MOV [ESI], EAX      ; Broadcast SIPI IPI to all APs
; 200-microsecond delay loop
MOV [ESI], EAX      ; Broadcast second SIPI IPI to all APs
                    ; Waits for the timer interrupt until the timer expires

এই কোডটিতে:

  1. বেশিরভাগ অপারেটিং সিস্টেমগুলি operations অপারেশনগুলিকে বেশিরভাগ রিং 3 (ব্যবহারকারী প্রোগ্রাম) থেকে অসম্ভব করে তুলবে।

    এটির সাথে নিখরচায় খেলতে আপনার নিজের কার্নেলটি লিখতে হবে: একটি ইউজারল্যান্ড লিনাক্স প্রোগ্রাম কাজ করবে না।

  2. প্রথমে, একটি একক প্রসেসর চালিত হয়, যার নাম বুটস্ট্র্যাপ প্রসেসর (বিএসপি)।

    এটি অবশ্যই ইন্টার প্রসেসর ইন্ট্রিপ্টস (আইপিআই) নামে বিশেষ বিঘ্নের মাধ্যমে অন্যদের (অ্যাপ্লিকেশন প্রসেসর (এপি)) জাগ্রত করতে হবে ।

    সেগুলি বাধাগুলি বিঘ্নিত কমান্ড রেজিস্টারের (আইসিআর) মাধ্যমে অ্যাডভান্সড প্রোগ্রামেবল ইন্টারফেট কন্ট্রোলার (এপিআইসি) প্রোগ্রামিংয়ের মাধ্যমে করা যেতে পারে

    আইসিআর এর ফর্ম্যাটটি এখানে নথিভুক্ত করা হয়েছে: 10.6 "ইন্টারপ্রেসেসর ইস্যু করা হচ্ছে"

    আমরা আইসিআর-কে লেখার সাথে সাথে আইপিআই ঘটে।

  3. ICR_LOW 8.4.4 "এমপি সূচনা উদাহরণ" হিসাবে সংজ্ঞায়িত করা হয়েছে:

    ICR_LOW EQU 0FEE00300H
    

    ম্যাজিক মান 0FEE00300হ'ল আইসিআর এর মেমরি ঠিকানা, টেবিল 10-1 "স্থানীয় এপিক রেজিস্টার ঠিকানা মানচিত্র" তে নথিভুক্ত রয়েছে

  4. সহজতম পদ্ধতিটি উদাহরণটিতে ব্যবহৃত হয়: এটি ব্রডকাস্ট আইপিআই প্রেরণের জন্য আইসিআর সেট আপ করে যা বর্তমান ব্যতীত অন্য সমস্ত প্রসেসরের কাছে সরবরাহ করা হয়।

    তবে এটিও সম্ভব, এবং কারও দ্বারা সুপারিশ করা হয়েছে , এসিপিআই টেবিল বা ইন্টেলের এমপি কনফিগারেশন টেবিলের মতো বিআইওএস দ্বারা বিশেষ ডেটা স্ট্রাকচার সেটআপের মাধ্যমে প্রসেসর সম্পর্কে তথ্য পেতে এবং কেবল আপনার একে একে জাগ্রত করা।

  5. XXমধ্যে 000C46XXHএনকোড প্রথম নির্দেশ যে প্রসেসর যেমন চালানো হবে ঠিকানা:

    CS = XX * 0x100
    IP = 0
    

    মনে রাখবেন যে সিএস দ্বারা ঠিকানাগুলি গুণিত করে0x10 , তাই প্রথম নির্দেশিকার আসল মেমরি ঠিকানাটি হ'ল:

    XX * 0x1000
    

    সুতরাং উদাহরণস্বরূপ XX == 1, প্রসেসর শুরু হবে 0x1000

    তারপরে আমাদের অবশ্যই তা নিশ্চিত করতে হবে যে সেই মেমরি লোকেশনে 16-বিট রিয়েল মোড কোড চালানো হবে, যেমন:

    cld
    mov $init_len, %ecx
    mov $init, %esi
    mov 0x1000, %edi
    rep movsb
    
    .code16
    init:
        xor %ax, %ax
        mov %ax, %ds
        /* Do stuff. */
        hlt
    .equ init_len, . - init
    

    লিঙ্কার স্ক্রিপ্ট ব্যবহার করা অন্য সম্ভাবনা।

  6. বিলম্বের লুপগুলি কাজ করার জন্য একটি বিরক্তিকর অংশ: সুনির্দিষ্টভাবে ঘুমানোর কোনও দুর্দান্ত সহজ উপায় নেই।

    সম্ভাব্য পদ্ধতিগুলির মধ্যে রয়েছে:

    • পিআইটি (আমার উদাহরণে ব্যবহৃত)
    • HPET
    • উপরের সাথে ব্যস্ত লুপের সময়টি ক্যালিব্রেট করুন এবং পরিবর্তে এটি ব্যবহার করুন

    সম্পর্কিত: কীভাবে স্ক্রিনে একটি নম্বর প্রদর্শিত হবে এবং ডস x86 সমাবেশের সাথে এক সেকেন্ডের জন্য ঘুমাবে?

  7. আমি মনে করি প্রাথমিক প্রসেসরের এটির জন্য সুরক্ষিত মোডে থাকা দরকার কারণ আমরা ঠিকানায় লিখি 0FEE00300Hযা 16-বিটের জন্য খুব বেশি

  8. প্রসেসরের মধ্যে যোগাযোগের জন্য, আমরা প্রধান প্রক্রিয়াটিতে একটি স্পিনলক ব্যবহার করতে পারি এবং দ্বিতীয় কোর থেকে লকটি সংশোধন করতে পারি।

    আমাদের নিশ্চিত করা উচিত যে স্মৃতি লিখনের কাজটি সম্পন্ন হয়েছে, উদাহরণস্বরূপ wbinvd

প্রসেসরের মধ্যে ভাগ করা রাষ্ট্র

৮..1.১ "লজিকাল প্রসেসরের রাজ্য" বলেছেন:

নিম্নলিখিত বৈশিষ্ট্যগুলি ইন্টেল 64 বা আইএ -32 প্রসেসরের ইনটেল হাইপার-থ্রেডিং প্রযুক্তি সমর্থনকারী লজিকাল প্রসেসরের আর্কিটেকচারাল স্টেটের অংশ। বৈশিষ্ট্যগুলি তিনটি গ্রুপে বিভক্ত করা যেতে পারে:

  • প্রতিটি লজিকাল প্রসেসরের জন্য নকল
  • একটি শারীরিক প্রসেসরে লজিকাল প্রসেসর দ্বারা ভাগ করা
  • ভাগ করা বা সদৃশ, বাস্তবায়নের উপর নির্ভর করে

প্রতিটি লজিকাল প্রসেসরের জন্য নিম্নলিখিত বৈশিষ্ট্যগুলি সদৃশ করা হয়েছে:

  • সাধারণ উদ্দেশ্যে নিবন্ধগুলি (EAX, EBX, ECX, EDX, ESI, EDI, ESP, এবং EBP)
  • বিভাগের নিবন্ধগুলি (সিএস, ডিএস, এসএস, ইএস, এফএস এবং জিএস)
  • EFLAGS এবং EIP রেজিস্টার। নোট করুন যে প্রতিটি লজিকাল প্রসেসরের জন্য সিএস এবং ইআইপি / আরআইপি নিবন্ধগুলি লজিকাল প্রসেসরের দ্বারা চালিত থ্রেডের জন্য নির্দেশ প্রবাহকে নির্দেশ করে।
  • x87 এফপিইউ নিবন্ধগুলি (এসটি 7 এর মাধ্যমে এসটি 0, স্থিতি শব্দ, নিয়ন্ত্রণ শব্দ, ট্যাগ শব্দ, ডেটা অপারেন্ড পয়েন্টার এবং নির্দেশ পয়েন্টার)
  • এমএমএক্স নিবন্ধগুলি (এমএম 7 এর মাধ্যমে এমএম0)
  • এক্সএমএম রেজিস্টার (এক্সএমএম 7 এর মাধ্যমে এক্সএমএম 0) এবং এমএক্সসিএসআর রেজিস্টার
  • নিয়ন্ত্রণ রেজিস্টার এবং সিস্টেম টেবিল পয়েন্টার রেজিস্টার (জিডিটিআর, এলডিডিআর, আইডিটিআর, টাস্ক রেজিস্টার)
  • ডিবাগ নিবন্ধগুলি (ডিআর 0, ডিআর 1, ডিআর 2, ডিআর 3, ডিআর 6, ডিআর 7) এবং ডিবাগ নিয়ন্ত্রণ এমএসআরগুলি
  • মেশিন চেক গ্লোবাল স্ট্যাটাস (IA32_MCG_STATUS) এবং মেশিন চেক ক্ষমতা (IA32_MCG_CAP) এমএসআর
  • তাপীয় ঘড়ি মোডুলেশন এবং এসিপিআই পাওয়ার পরিচালনা নিয়ন্ত্রণ এমএসআরগুলি
  • টাইম স্ট্যাম্প কাউন্টার এমএসআর
  • পৃষ্ঠা অ্যাট্রিবিউট টেবিল (পিএটি) সহ অন্যান্য এমএসআর বেশিরভাগ রেজিস্টার। নীচে ব্যতিক্রম দেখুন।
  • স্থানীয় এপিক রেজিস্ট্রেশন করে।
  • অতিরিক্ত সাধারণ উদ্দেশ্যে নিবন্ধগুলি (আর 8-আর 15), এক্সএমএম রেজিস্টারগুলি (এক্সএমএম 8-এক্সএমএম 15), কন্ট্রোল রেজিস্টার, আইএএ 32_ ইফার ইনটেল 64 প্রসেসরের উপর।

নিম্নলিখিত বৈশিষ্ট্যগুলি লজিকাল প্রসেসর দ্বারা ভাগ করা হয়েছে:

  • মেমরি ধরণের রেঞ্জ রেজিস্টার (এমটিআরআর)

নিম্নলিখিত বৈশিষ্ট্যগুলি ভাগ করা বা সদৃশ কিনা তা বাস্তবায়ন-নির্দিষ্ট:

  • IA32_MISC_ENABLE MSR (MSR ঠিকানা 1A0H)
  • মেশিন চেক আর্কিটেকচার (এমসিএ) এমএসআরগুলি (IA32_MCG_STATUS এবং IA32_MCG_CAP এমএসআর ব্যতীত)
  • পারফরম্যান্স মনিটরিং কন্ট্রোল এবং এমএসআরদের কাউন্টারে

ক্যাশে ভাগ করে নেওয়ার বিষয়ে আলোচনা করা হয়েছে:

ইন্টেল হাইপারথ্রেডগুলির পৃথক কোরের চেয়ে ক্যাশে এবং পাইপলাইন ভাগ করে নেওয়া রয়েছে: https://superuser.com

লিনাক্স কার্নেল ৪.২

মূল সূচনা কর্মটি মনে হচ্ছে arch/x86/kernel/smpboot.c

এআরএম ন্যূনতম চলমানযোগ্য খোলামেলা উদাহরণ

এখানে আমি কিউইএমইউর জন্য একটি ন্যূনতম চলমানযোগ্য এআরএমভি 8 আরচ 64 উদাহরণ সরবরাহ করি:

.global mystart
mystart:
    /* Reset spinlock. */
    mov x0, #0
    ldr x1, =spinlock
    str x0, [x1]

    /* Read cpu id into x1.
     * TODO: cores beyond 4th?
     * Mnemonic: Main Processor ID Register
     */
    mrs x1, mpidr_el1
    ands x1, x1, 3
    beq cpu0_only
cpu1_only:
    /* Only CPU 1 reaches this point and sets the spinlock. */
    mov x0, 1
    ldr x1, =spinlock
    str x0, [x1]
    /* Ensure that CPU 0 sees the write right now.
     * Optional, but could save some useless CPU 1 loops.
     */
    dmb sy
    /* Wake up CPU 0 if it is sleeping on wfe.
     * Optional, but could save power on a real system.
     */
    sev
cpu1_sleep_forever:
    /* Hint CPU 1 to enter low power mode.
     * Optional, but could save power on a real system.
     */
    wfe
    b cpu1_sleep_forever
cpu0_only:
    /* Only CPU 0 reaches this point. */

    /* Wake up CPU 1 from initial sleep!
     * See:https://github.com/cirosantilli/linux-kernel-module-cheat#psci
     */
    /* PCSI function identifier: CPU_ON. */
    ldr w0, =0xc4000003
    /* Argument 1: target_cpu */
    mov x1, 1
    /* Argument 2: entry_point_address */
    ldr x2, =cpu1_only
    /* Argument 3: context_id */
    mov x3, 0
    /* Unused hvc args: the Linux kernel zeroes them,
     * but I don't think it is required.
     */
    hvc 0

spinlock_start:
    ldr x0, spinlock
    /* Hint CPU 0 to enter low power mode. */
    wfe
    cbz x0, spinlock_start

    /* Semihost exit. */
    mov x1, 0x26
    movk x1, 2, lsl 16
    str x1, [sp, 0]
    mov x0, 0
    str x0, [sp, 8]
    mov x1, sp
    mov w0, 0x18
    hlt 0xf000

spinlock:
    .skip 8

গিটহাব উজানের দিকে

একত্রিত হয়ে চালান:

aarch64-linux-gnu-gcc \
  -mcpu=cortex-a57 \
  -nostdlib \
  -nostartfiles \
  -Wl,--section-start=.text=0x40000000 \
  -Wl,-N \
  -o aarch64.elf \
  -T link.ld \
  aarch64.S \
;
qemu-system-aarch64 \
  -machine virt \
  -cpu cortex-a57 \
  -d in_asm \
  -kernel aarch64.elf \
  -nographic \
  -semihosting \
  -smp 2 \
;

এই উদাহরণস্বরূপ, আমরা একটি স্পিনলক লুপে সিপিইউ 0 রেখেছি এবং এটি কেবল সিপিইউ 1 দিয়ে স্পিনলক প্রকাশ করে।

স্পিনলকের পরে, সিপিইউ 0 তারপর একটি সেমিহোস্ট প্রস্থান কল করে যা কিউইএমইউকে প্রস্থান করে।

আপনি যদি মাত্র একটি সিপিইউ দিয়ে কিউইএমইউ শুরু করেন -smp 1তবে সিমুলেশনটি স্পিনলকের উপর চিরতরে স্তব্ধ।

সিপিইউ 1 পিএসসিআই ইন্টারফেসের সাথে জেগে উঠেছে, আরও বিশদ এখানে: এআরএম: স্টার্ট / ওয়াকআপ / অন্যান্য সিপিইউ কোর / এপিগুলি আনুন এবং এক্সিকিউশন শুরুর ঠিকানাটি পাস করবেন?

মূল প্রজেক্টের সংস্করণ এছাড়াও যাতে আপনি কর্মক্ষমতা বৈশিষ্ট্য সঙ্গে পাশাপাশি পরীক্ষা করতে পারেন, এটা gem5 কাজ করতে একটি কয়েক tweaks হয়েছে।

আমি এটি সত্যিকারের হার্ডওয়্যারে পরীক্ষা করে দেখিনি, সুতরাং আমি নিশ্চিত না যে এটি কতটা পোর্টেবল। নিম্নলিখিত রাস্পবেরি পাই গ্রন্থাগারটি আগ্রহী হতে পারে:

এই দস্তাবেজটি এআরএম সিঙ্ক্রোনাইজেশন প্রিমিটিভের ব্যবহার করে কিছু দিক নির্দেশনা যা আপনি পরে একাধিক কোর সঙ্গে মজা কিছু করার ব্যবহার করতে পারেন প্রদান করে: http://infocenter.arm.com/help/topic/com.arm.doc.dht0008a/DHT0008A_arm_synchronization_primitives.pdf

উবুন্টু 18.10, জিসিসি 8.2.0, বিন্টিলস 2.31.1, কিউইএমইউ 2.12.0 এ পরীক্ষিত।

আরও সুবিধাজনক প্রোগ্রামযোগ্যতার জন্য পরবর্তী পদক্ষেপ

পূর্ববর্তী উদাহরণগুলি মাধ্যমিক সিপিইউ জেগে থাকে এবং উত্সর্গীকৃত নির্দেশাবলীর সাথে বেসিক মেমরি সিঙ্ক্রোনাইজেশন করে, যা একটি ভাল শুরু।

তবে মাল্টিকোর সিস্টেমগুলিকে প্রোগ্রাম করা সহজ করার জন্য, যেমন পসিক্সের মতো pthreads, আপনাকে নিম্নলিখিত আরও জড়িত বিষয়ের মধ্যে যেতে হবে:

  • সেটআপ বাধা দেয় এবং একটি টাইমার চালিত করে যা নিয়মিত সিদ্ধান্ত নেয় যে কোন থ্রেডটি এখন চলবে। এটি প্রিম্পিটিভ মাল্টিথ্রেডিং হিসাবে পরিচিত ।

    এই জাতীয় সিস্টেমে থ্রেড রেজিস্টারগুলি শুরু এবং বন্ধ হওয়ার সাথে সাথে সংরক্ষণ এবং পুনরুদ্ধার করা দরকার।

    অ-প্রাকিমিটিভ মাল্টিটাস্কিং সিস্টেম থাকাও সম্ভব, তবে সেগুলির জন্য আপনার কোডটি পরিবর্তন করার প্রয়োজন হতে পারে যাতে প্রতিটি থ্রেড ফলন দেয় (যেমন একটি pthread_yieldপ্রয়োগের সাথে), এবং কাজের চাপ ভারসাম্য বজায় রাখা আরও শক্ত হয়ে যায়।

    এখানে কয়েকটি সরলবস্তু খালি ধাতব টাইমার উদাহরণ রয়েছে:

  • স্মৃতি বিরোধের সাথে ডিল করুন। উল্লেখযোগ্যভাবে, আপনি সি বা অন্যান্য উচ্চ স্তরের ভাষায় কোড করতে চাইলে প্রতিটি থ্রেডের একটি অনন্য স্ট্যাকের প্রয়োজন হবে ।

    আপনি কেবল থ্রেডগুলিকে একটি সর্বাধিক স্ট্যাক আকারের জন্য সীমাবদ্ধ করতে পারেন তবে এর সাথে মোকাবিলা করার সর্বোত্তম উপায় হল পেজিং সহ যা দক্ষ "সীমাহীন আকার" স্ট্যাকের অনুমতি দেয়।

    এখানে একটি নিষ্পাপ আড়ম্বরপূর্ণ খালি উদাহরণ রয়েছে যা স্ট্যাকটি আরও গভীরভাবে বাড়লে আপ ফুঁকবে

লিনাক্স কার্নেল বা অন্য কোনও অপারেটিং সিস্টেম ব্যবহার করার জন্য এটি কয়েকটি ভাল কারণ :-)

ইউজারল্যান্ড মেমরি সিঙ্ক্রোনাইজেশন আদিম

থ্রেড স্টার্ট / স্টপ / ম্যানেজমেন্ট সাধারণত ইউজারল্যান্ড স্কোপ ছাড়িয়ে গেলেও আপনি সম্ভাব্য বেশি ব্যয়বহুল সিস্টেম কল ছাড়াই মেমরি অ্যাক্সেসগুলিকে সিঙ্ক্রোনাইজ করতে ইউজারল্যান্ড থ্রেড থেকে সমাবেশ নির্দেশাবলী ব্যবহার করতে পারেন instructions

আপনার অবশ্যই এমন লাইব্রেরিগুলি পছন্দ করা উচিত যা এই নিম্ন স্তরের আদিমগুলিকে পোর্টেবল মোড়ানো থাকে। সি ++ স্ট্যান্ডার্ড নিজে <mutex>এবং <atomic>হেডারগুলিতে এবং বিশেষত এর সাথে দুর্দান্ত অগ্রগতি করেছে std::memory_order। আমি নিশ্চিত না যে এটি সমস্ত সম্ভাব্য মেমরি শব্দার্থকগুলি অর্জনযোগ্যকে কভার করে কিনা তবে এটি সম্ভবত might

আরও সূক্ষ্ম শব্দার্থবিজ্ঞান লক ফ্রি ডেটা স্ট্রাকচারের প্রসঙ্গে বিশেষভাবে প্রাসঙ্গিক , যা নির্দিষ্ট ক্ষেত্রে পারফরম্যান্স সুবিধা দিতে পারে। এগুলি বাস্তবায়নের জন্য, আপনাকে বিভিন্ন ধরণের মেমোরি বাধা সম্পর্কে সম্ভবত কিছুটা শিখতে হবে: https://preshing.com/20120710/mmory- Barিয়ার-are- Like-source-control-operation/

বুস্ট উদাহরণস্বরূপ এখানে কিছু লক ফ্রি কনটেইনার বাস্তবায়ন রয়েছে: https://www.boost.org/doc/libs/1_63_0/doc/html/ockfree.html

এই জাতীয় ব্যবহারকারী নির্দেশাবলী লিনাক্স futexসিস্টেম কল প্রয়োগ করার জন্য ব্যবহার করা হয় , যা লিনাক্সের অন্যতম প্রধান সিঙ্ক্রোনাইজেশন আদিম। man futex4.15 পঠিত:

Futex () সিস্টেম কলটি নির্দিষ্ট শর্তটি সত্য না হওয়া পর্যন্ত অপেক্ষা করার জন্য একটি পদ্ধতি সরবরাহ করে। এটি সাধারণত ভাগ করা-মেমরি সিঙ্ক্রোনাইজেশনের প্রসঙ্গে ব্লকিং কনস্ট্রাক্ট হিসাবে ব্যবহৃত হয়। ফিউটেক্সগুলি ব্যবহার করার সময়, সিংক্রোনাইজেশনের বেশিরভাগ ক্রিয়াকলাপ ব্যবহারকারীর জায়গায় সঞ্চালিত হয়। কোনও ইউজার-স্পেস প্রোগ্রাম কেবল তখনই ফিউটেক্স () সিস্টেম কল নিয়োগ করে যখন শর্তটি সত্য না হওয়া পর্যন্ত প্রোগ্রামটিকে দীর্ঘ সময়ের জন্য ব্লক করতে হবে। অন্যান্য ফুটেক্স () অপারেশনগুলি কোনও বিশেষ শর্তের জন্য অপেক্ষা করা কোনও প্রক্রিয়া বা থ্রেড জাগ্রত করতে ব্যবহার করা যেতে পারে।

সিস্কেল নামের অর্থ নিজেই "ফাস্ট ইউজারস্পেস XXX"।

এখানে ইনলাইন অ্যাসেমব্লির সাথে একটি ন্যূনতম অপ্রয়োজনীয় সি ++ x86_64 / আড়াল 64৪ উদাহরণ রয়েছে যা মূলত মজাদার জন্য এই জাতীয় নির্দেশের প্রাথমিক ব্যবহার চিত্রিত করে:

main.cpp

#include <atomic>
#include <cassert>
#include <iostream>
#include <thread>
#include <vector>

std::atomic_ulong my_atomic_ulong(0);
unsigned long my_non_atomic_ulong = 0;
#if defined(__x86_64__) || defined(__aarch64__)
unsigned long my_arch_atomic_ulong = 0;
unsigned long my_arch_non_atomic_ulong = 0;
#endif
size_t niters;

void threadMain() {
    for (size_t i = 0; i < niters; ++i) {
        my_atomic_ulong++;
        my_non_atomic_ulong++;
#if defined(__x86_64__)
        __asm__ __volatile__ (
            "incq %0;"
            : "+m" (my_arch_non_atomic_ulong)
            :
            :
        );
        // https://github.com/cirosantilli/linux-kernel-module-cheat#x86-lock-prefix
        __asm__ __volatile__ (
            "lock;"
            "incq %0;"
            : "+m" (my_arch_atomic_ulong)
            :
            :
        );
#elif defined(__aarch64__)
        __asm__ __volatile__ (
            "add %0, %0, 1;"
            : "+r" (my_arch_non_atomic_ulong)
            :
            :
        );
        // https://github.com/cirosantilli/linux-kernel-module-cheat#arm-lse
        __asm__ __volatile__ (
            "ldadd %[inc], xzr, [%[addr]];"
            : "=m" (my_arch_atomic_ulong)
            : [inc] "r" (1),
              [addr] "r" (&my_arch_atomic_ulong)
            :
        );
#endif
    }
}

int main(int argc, char **argv) {
    size_t nthreads;
    if (argc > 1) {
        nthreads = std::stoull(argv[1], NULL, 0);
    } else {
        nthreads = 2;
    }
    if (argc > 2) {
        niters = std::stoull(argv[2], NULL, 0);
    } else {
        niters = 10000;
    }
    std::vector<std::thread> threads(nthreads);
    for (size_t i = 0; i < nthreads; ++i)
        threads[i] = std::thread(threadMain);
    for (size_t i = 0; i < nthreads; ++i)
        threads[i].join();
    assert(my_atomic_ulong.load() == nthreads * niters);
    // We can also use the atomics direclty through `operator T` conversion.
    assert(my_atomic_ulong == my_atomic_ulong.load());
    std::cout << "my_non_atomic_ulong " << my_non_atomic_ulong << std::endl;
#if defined(__x86_64__) || defined(__aarch64__)
    assert(my_arch_atomic_ulong == nthreads * niters);
    std::cout << "my_arch_non_atomic_ulong " << my_arch_non_atomic_ulong << std::endl;
#endif
}

গিটহাব উজানের দিকে

সম্ভাব্য আউটপুট:

my_non_atomic_ulong 15264
my_arch_non_atomic_ulong 15267

এ থেকে আমরা দেখতে পাই যে x86 এলওএকেকে উপসর্গ / আড়াল 64৪ LDADDনির্দেশনাই সংযোজনটিকে পারমাণবিক করে তুলেছে: এটি ছাড়া আমাদের অনেকগুলি অ্যাডের রেসের শর্ত রয়েছে এবং শেষে মোট গণনাটি সিঙ্ক্রোনাইজড 20000 এর চেয়ে কম is

আরো দেখুন:

উবুন্টু 19.04 amd64 এবং QEMU aarch64 ব্যবহারকারী মোডের সাথে পরীক্ষিত।


আপনার উদাহরণটি সংকলন করতে আপনি কোন সমাবেশকারী ব্যবহার করেন? জিএএস আপনার #include(এটি একটি মন্তব্য হিসাবে গ্রহণ করে) পছন্দ করে না বলে মনে হচ্ছে , এনএএসএম, এফএএসএম, ইয়াএসএম এটি অ্যান্ড টি সিনট্যাক্স জানেন না তাই এটি তাদের হতে পারে না ... তবে এটি কী?
Ruslan

@ রাস্লান gcc, #includeসি প্রিপ্রোসেসর থেকে আসে। প্রারম্ভিকMakefile অংশে বর্ণিত হিসাবে প্রদত্ত ব্যবহার করুন : github.com/cirosantilli/x86-bare-metal-example/blob/… যদি এটি কাজ না করে, একটি গিটহাব ইস্যু খুলুন।
সিরো সান্তিলি 郝海东 冠状 病 六四 事件

x86-এ, যদি কোনও কোর বুঝতে পারে যে কাতারে চালানোর জন্য আরও কোনও প্রক্রিয়া প্রস্তুত নেই? (যা নিষ্ক্রিয় সিস্টেমে সময়ে সময়ে হতে পারে)। নতুন কাজ না হওয়া পর্যন্ত ভাগ করে নেওয়া মেমরি স্ট্রাকচারটিতে মূল স্পিনলকটি রয়েছে? (সম্ভবত এটি ভাল নয় যে এটি প্রচুর শক্তি ব্যবহার করবে) এটি বাধা না দেওয়া পর্যন্ত ঘুমের জন্য এইচএলটি-র মতো কিছু বলে? (
সেক্ষেত্রে

@টিগ্রাউন্ড নিশ্চিত নন, তবে আমি অত্যন্ত সম্ভবত বলেছি যে লিনাক্স বাস্তবায়ন এটিকে পরবর্তী অবস্থায় (সম্ভবত টাইমার) বিঘ্নিত হওয়া পর্যন্ত, বিশেষত এআরএমের যেখানে শক্তি কী until আমি লিনাক্স চলমান সিমুলেটারের কোনও নির্দেশের ট্রেস দিয়ে তা সহজেই পর্যবেক্ষণ করা যায় কিনা তা দেখার জন্য আমি দ্রুত চেষ্টা করব, এটি হতে পারে: github.com/cirosantilli/linux-kernel-module-cheat/tree/…
Ciro Santilli 郝海东 冠状 病:24 事件 法轮功

1
কিছু তথ্য (x86 / উইন্ডোজ নির্দিষ্ট) এখানে পাওয়া যাবে (দেখুন "নিষ্ক্রিয় থ্রেড")। টিএল; ডিআর: সিপিইউতে যখন কোনও চলমান থ্রেড উপস্থিত না থাকে, তখন সিপিইউ নিষ্ক্রিয় থ্রেডে প্রেরণ করা হয়। কিছু অন্যান্য কাজের পাশাপাশি এটি চূড়ান্তভাবে রেজিস্টার্ড পাওয়ার ম্যানেজমেন্ট প্রসেসর নিষ্ক্রিয় রুটিনকে কল করবে (সিপিইউ বিক্রেতার দ্বারা সরবরাহ করা ড্রাইভারের মাধ্যমে, যেমন: ইন্টেল)। এটি সিপিইউকে কিছুটা গভীর সি-স্টেটে স্থানান্তর করতে পারে (যেমন: সি 0 -> সি 3) যাতে বিদ্যুতের খরচ কমাতে পারে।
tigrou

43

আমি এটি যেমন বুঝতে পারি, প্রতিটি "কোর" একটি সম্পূর্ণ প্রসেসর, যার নিজস্ব রেজিস্টার সেট রয়েছে। মূলত, BIOS আপনাকে একটি কোর চলমান দিয়ে শুরু করে এবং তারপরে অপারেটিং সিস্টেম অন্য কোরগুলি শুরু করে এবং চালানোর কোডগুলিতে ইঙ্গিত করে অন্য "কোর" শুরু করতে পারে etc.

সিঙ্ক্রোনাইজেশন ওএস দ্বারা সম্পন্ন হয়। সাধারণত, প্রতিটি প্রসেসর ওএসের জন্য একটি পৃথক প্রক্রিয়া চালিত হয়, তাই অপারেটিং সিস্টেমের মাল্টি-থ্রেডিং কার্যকারিতাটি কোন প্রক্রিয়াটি কোন স্মৃতি স্পর্শ করে এবং মেমরির সংঘর্ষের ক্ষেত্রে কী করবে তা নির্ধারণের দায়িত্বে থাকে।


28
যদিও এই প্রশ্নটি ভিক্ষা করে: অপারেটিং সিস্টেমটি করার জন্য কোন নির্দেশাবলী পাওয়া যায়?
পল হোলিংসওয়ার্থ

4
এর জন্য প্রাইভেলগড নির্দেশাবলীর একটি সেট রয়েছে তবে এটি অপারেটিং সিস্টেমের সমস্যা, অ্যাপ্লিকেশন কোড নয়। যদি অ্যাপ্লিকেশন কোডটি মাল্টিথ্রেড হতে চায় তবে এটি "ম্যাজিক" করতে অপারেটিং সিস্টেমের ফাংশনগুলি কল করতে হবে।
শার্পথুথ

2
বিআইওএস সাধারণত কয়টি কোর উপলব্ধ তা সনাক্ত করবে এবং জিজ্ঞাসা করা হলে এই তথ্যটি ওএসের কাছে পৌঁছে দেবে। বিআইওএস (এবং হার্ডওয়্যার) এমন মানদণ্ডগুলির সাথে মেনে চলতে হবে যা বিভিন্ন পিসির জন্য হার্ডওয়্যার নির্দিষ্টকরণ (প্রসেসর, কোর, পিসিআই বাস, পিসিআই কার্ড, মাউস, কীবোর্ড, গ্রাফিক্স, আইএসএ, পিসিআই-ই / এক্স, মেমরি ইত্যাদি) অ্যাক্সেস করতে পারে ওএসের দৃষ্টিকোণ থেকে একই দেখাচ্ছে। যদি বায়োস চারটি কোর রয়েছে না জানিয়ে দেয় তবে ওএস সাধারণত ধরে নেবে যে কেবল একটি আছে। এমনকি পরীক্ষার জন্য কোনও বিআইওএস সেটিংও থাকতে পারে।
অলিফ ফোরশেল

1
এটি দুর্দান্ত এবং সব কিছু যদি আপনি একটি খালি-ধাতু প্রোগ্রাম লিখতে থাকেন তবে কী হবে?
আলেকজান্ডার রায়ান ব্যাগেট

3
@ আলেকজান্ডাররয়ান ব্যাগেট,? এটা কি? পুনরাবৃত্তি, যখন আমরা বলি "ওএসে ছেড়ে দিন", তখন আমরা প্রশ্নটি এড়িয়ে চলেছি কারণ প্রশ্নটি ওএস তখন এটি কী করে? এটি কি সমাবেশ নির্দেশাবলী ব্যবহার করে?
পেসারিয়ার

39

অনানুষ্ঠানিক এসএমপি এফএকিউ ওভারফ্লো লোগো স্ট্যাক করুন


একসময়, x86 এসেম্বলার লিখতে, উদাহরণস্বরূপ, আপনার কাছে নির্দেশাবলী থাকবে যে "ইডিএক্স রেজিস্টারটি 5 এর মান দিয়ে লোড করুন", "ইডিএক্স ইনক্রিমেন্ট" রেজিস্টার ইত্যাদি। আধুনিক সিপিইউতে 4 টি কোর (বা আরও বেশি) রয়েছে , মেশিন কোড স্তরে কি এটি দেখতে দেখতে 4 টি পৃথক সিপিইউ রয়েছে (অর্থাত্ এখানে কেবল 4 টি স্বতন্ত্র "ইডিএক্স" রেজিস্ট্রার রয়েছে)?

যথাযথভাবে। এখানে 4 টি পৃথক নির্দেশ পয়েন্টার সহ নিবন্ধের 4 সেট রয়েছে।

যদি তাই হয়, আপনি যখন "ইডিএক্স রেজিস্টার বাড়িয়ে দিন" বলবেন তখন কোন সিপিইউর ইডিএক্স নিবন্ধটি বাড়ানো হবে তা নির্ধারণ করে?

সিপিইউ যে প্রাকৃতিকভাবে সেই নির্দেশ কার্যকর করেছিল। এটিকে 4 সম্পূর্ণ ভিন্ন মাইক্রোপ্রসেসর হিসাবে ভাবেন যা কেবল একই মেমরিটি ভাগ করে নিচ্ছে।

X86 এসেম্বলারের এখন কি কোনও "সিপিইউ প্রসঙ্গ" বা "থ্রেড" ধারণা আছে?

না। সমাবেশকারীর নির্দেশাবলী যেমন এটি সর্বদা হয় ঠিক তেমন অনুবাদ করে। সেখানে কোনও পরিবর্তন নেই।

কোরগুলির মধ্যে যোগাযোগ / সিঙ্ক্রোনাইজেশন কীভাবে কাজ করে?

যেহেতু তারা একই স্মৃতি ভাগ করে নেয়, তাই এটি বেশিরভাগ প্রোগ্রামের যুক্তির বিষয়। যদিও এখন সেখানে একটি আন্ত-প্রসেসরের বাধা ব্যবস্থার ব্যবস্থা রয়েছে, এটি প্রয়োজনীয় নয় এবং প্রথম ডুয়েল-সিপিইউ x86 সিস্টেমে মূলত উপস্থিত ছিল না।

আপনি যদি কোনও অপারেটিং সিস্টেম লেখেন, তবে আপনাকে বিভিন্ন কোরে মৃত্যুদন্ড কার্যকর করার সময়সূচী দেওয়ার জন্য হার্ডওয়্যারের মাধ্যমে কোন প্রক্রিয়াটি উদ্ভাসিত হয়?

শিডিয়ুলারটি আসলে পরিবর্তিত হয় না, এটি সমালোচনামূলক বিভাগগুলি এবং ব্যবহৃত লকের ধরণের সম্পর্কে কিছুটা সতর্কতার সাথে থাকে। এসএমপির আগে, কার্নেল কোডটি শেষ পর্যন্ত সিডিউলারকে কল করত, যা রান সারিটি দেখত এবং পরবর্তী থ্রেড হিসাবে চালানোর জন্য কোনও প্রক্রিয়া বাছাই করে। (কার্নেলের প্রসেসগুলি থ্রেডের মতো দেখতে অনেকগুলি দুর্দান্ত লাগে)) এসএমপি কার্নেলটি একই সময়ে একই থ্রেড চালায়, এক সময় একটি থ্রেড, এটি এখন ঠিক যে দুটি কোরিটি ঘটনাক্রমে বাছাই করতে পারে না তা নিশ্চিত করার জন্য এখন সমালোচনামূলক বিভাগটি লক করা দরকার এসএমপি-নিরাপদ হওয়া needs একই পিআইডি

এটি কি কোনও বিশেষ সুবিধাযুক্ত নির্দেশ (গুলি)?

না। কোরগুলি একই পুরানো নির্দেশাবলীতে একই মেমোরিতে চলছে running

আপনি যদি কোনও মাল্টিকোর সিপিইউয়ের জন্য একটি অনুকূলিতকরণ সংকলক / বাইটকোড ভিএম লিখছিলেন, তবে আপনাকে সমস্ত কোরে দক্ষতার সাথে কার্যকরভাবে কোড তৈরি করার জন্য x86 সম্পর্কে বিশেষভাবে কী জানা দরকার?

আপনি আগের মত একই কোড চালান। এটি ইউনিক্স বা উইন্ডোজ কার্নেল যা পরিবর্তন করা প্রয়োজন।

আপনি আমার প্রশ্নের সংক্ষিপ্তসার হিসাবে বলতে পারেন "মাল্টি-কোর কার্যকারিতা সমর্থন করার জন্য x86 মেশিন কোডে কি পরিবর্তন করা হয়েছে?"

কিছুই প্রয়োজন ছিল না। প্রথম এসএমপি সিস্টেমগুলি ইউনিকপ্রসেসর হিসাবে ঠিক একই নির্দেশিকা সেট ব্যবহার করেছিল। এখন, x86 আর্কিটেকচার বিবর্তন এবং জিনিসগুলি দ্রুত এগিয়ে যাওয়ার লক্ষ লক্ষ লক্ষ নির্দেশনা রয়েছে, তবে এসএমপি-র জন্য কোনওটিরই প্রয়োজন ছিল না ।

আরও তথ্যের জন্য, ইন্টেল মাল্টিপ্রসেসর স্পেসিফিকেশন দেখুন


আপডেট: সমস্ত ফলো-আপ প্রশ্নের উত্তর পুরোপুরি মেনে নেওয়া যায় যে একটি এন- ওয়ে মাল্টিকোর সিপিইউ প্রায় 1 ঠিক একই মেমরির ভাগ করা এন পৃথক প্রসেসরের মতো একই জিনিস । 2 একটি গুরুত্বপূর্ণ প্রশ্ন জিজ্ঞাসা করা হয়নি: কীভাবে একটি প্রোগ্রামকে আরও বেশি পারফরম্যান্সের জন্য একাধিক কোরকে চালিত করার জন্য লেখা হয়? এবং উত্তরটি হ'ল: এটি থ্রেড লাইব্রেরির মতো ব্যবহার করা হয়েছে প্যাথ্রেডস। কিছু থ্রেড গ্রন্থাগারগুলি "সবুজ থ্রেড" ব্যবহার করে যা ওএসের কাছে দৃশ্যমান নয় এবং সেগুলি পৃথক পৃথক কোর পাবে না, তবে যতক্ষণ থ্রেড গ্রন্থাগার কার্নেল থ্রেড বৈশিষ্ট্য ব্যবহার করে ততক্ষণ আপনার থ্রেডযুক্ত প্রোগ্রামটি স্বয়ংক্রিয়ভাবে মাল্টিকোর হয়ে যাবে।
১. পিছনের সামঞ্জস্যের জন্য, কেবলমাত্র প্রথম কোরটি পুনরায় সেট করার সময় শুরু হয় এবং বাকীগুলি চালিত করার জন্য কয়েকটি ড্রাইভার-ধরণের জিনিস করা দরকার।
২. এগুলি প্রাকৃতিকভাবে সমস্ত পেরিফেরিয়ালগুলি ভাগ করে।


3
আমি সবসময় মনে করি "থ্রেড" একটি সফ্টওয়্যার ধারণা, যা আমাকে মাল্টি-কোর প্রসেসর বুঝতে অসুবিধে করে তোলে, সমস্যাটি হল, কোডগুলি কোনও কোরকে কীভাবে বলতে পারে "আমি কোর 2 তে চলমান একটি থ্রেড তৈরি করতে যাচ্ছি"? এটি করার জন্য কোনও বিশেষ সমাবেশ কোড আছে?
demonguy

2
@ ডেমডংয়ে: না, এর মতো কোনও কিছুর জন্য বিশেষ নির্দেশনা নেই। আপনি ওএসকে একটি স্পেনিটি মাস্ক সেট করে একটি নির্দিষ্ট কোরটিতে আপনার থ্রেডটি চালাতে বলছেন (যা "এই থ্রেডটি লজিকাল কোরের এই সেটটিতে চলতে পারে")। এটি সম্পূর্ণরূপে একটি সফ্টওয়্যার সমস্যা। প্রতিটি সিপিইউ কোর (হার্ডওয়্যার থ্রেড) স্বতন্ত্রভাবে লিনাক্স (বা উইন্ডোজ) চলছে। অন্যান্য হার্ডওয়্যার থ্রেডের সাথে একসাথে কাজ করতে, তারা ভাগ করা ডেটা স্ট্রাকচার ব্যবহার করে। তবে আপনি কখনই আলাদা সিপিইউতে "সরাসরি" থ্রেড শুরু করেন না। আপনি ওএসকে বলুন যে আপনি একটি নতুন থ্রেড রাখতে চান এবং এটি কোনও ডাটা স্ট্রাকচারে একটি নোট তৈরি করে যা অন্য একটি কোরের ওএস দেখে।
পিটার কর্ডস

2
আমি এটি ওএসকে বলতে পারি, তবে ওএস নির্দিষ্ট কোরটিতে কোডগুলি কীভাবে রাখে?
demonguy

4
@ ডেমোঙ্গুয়ে ... (সরলীকৃত) ... প্রতিটি কোর ওএস চিত্রটি ভাগ করে এবং এটি একই জায়গায় চালানো শুরু করে। সুতরাং, 8 টি কোরের জন্য, এটি 8 "হার্ডওয়্যার প্রক্রিয়াগুলি" কার্নেলের মধ্যে চলছে। প্রত্যেকে একই সময়সূচী ফাংশনটিকে কল করে যা একটি চলমান প্রক্রিয়া বা থ্রেডের জন্য প্রক্রিয়া সারণীটি পরীক্ষা করে। (এটি রান কাতারে। ) এদিকে, থ্রেড সহ প্রোগ্রামগুলি অন্তর্নিহিত এসএমপি প্রকৃতির সচেতনতা ছাড়াই কাজ করে। তারা কেবল (2) বা কিছু কাঁটাচামচ করে এবং কার্নেলটি জানিয়ে দেয় যে তারা চালাতে চায়। মূলত, কোরটি প্রক্রিয়াটি আবিষ্কার করে পরিবর্তে প্রক্রিয়াটি কোর আবিষ্কার করে finding
ডিজিটালরোস

1
আপনাকে অন্যটি থেকে একটি কোরকে বাধা দেওয়ার দরকার নেই। এটি এইভাবে চিন্তা করুন: আপনার আগে যোগাযোগ করার জন্য যা কিছু প্রয়োজন ছিল তা সফ্টওয়্যার প্রক্রিয়া দ্বারা ঠিক সূচিত হয়েছিল । একই সফ্টওয়্যার প্রক্রিয়া কাজ অবিরত। সুতরাং, পাইপ, কার্নেল কল, ঘুম / জাগ্রত, সমস্ত জিনিস ... তারা এখনও আগের মতো কাজ করে। প্রতিটি প্রক্রিয়া একই সিপিইউতে চলছে না তবে তাদের যোগাযোগের জন্য পূর্বের মতো একই ধরণের ডেটা স্ট্রাকচার রয়েছে। এসএমপি যাওয়ার প্রচেষ্টাটি বেশিরভাগ পুরানো লকগুলিকে আরও সমান্তরাল পরিবেশে কাজ করার মধ্যে সীমাবদ্ধ।
ডিজিটালরোস

10

আপনি যদি কোনও মাল্টিকোর সিপিইউয়ের জন্য একটি অনুকূলিতকরণ সংকলক / বাইটকোড ভিএম লিখছিলেন, তবে আপনাকে সমস্ত কোরে দক্ষতার সাথে কার্যকরভাবে কোড তৈরি করার জন্য x86 সম্পর্কে বিশেষভাবে কী জানা দরকার?

যে কেউ সংকলক / বাইটকোড ভিএমএস অনুকূল করে লেখেন আমি আপনাকে এখানে সহায়তা করতে সক্ষম হতে পারি।

আপনাকে সমস্ত কোরে দক্ষতার সাথে কার্যকরভাবে কোড তৈরি করতে কোড উত্পন্ন করতে আপনাকে x86 সম্পর্কে বিশেষভাবে কিছু জানার দরকার নেই।

তবে সঠিকভাবে চলমান কোডটি লেখার জন্য আপনাকে সিএমপিএক্সচজি এবং বন্ধুদের সম্পর্কে জানতে হতে পারে সমস্ত কোরে । মাল্টিকোর প্রোগ্রামিংয়ের জন্য মৃত্যুদন্ড কার্যকর করার থ্রেডগুলির মধ্যে সিঙ্ক্রোনাইজেশন এবং যোগাযোগের প্রয়োজন।

আপনাকে সাধারণভাবে x86 এর সাথে দক্ষতার সাথে চলমান এমন কোড তৈরি করতে x86 সম্পর্কে কিছু জানা দরকার।

এটি শিখতে আপনার পক্ষে দরকারী অন্যান্য জিনিস রয়েছে:

ওএস (লিনাক্স বা উইন্ডোজ বা ওএসএক্স) আপনাকে একাধিক থ্রেড চালানোর অনুমতি দেয় এমন বৈশিষ্ট্যগুলি সম্পর্কে আপনার শিখতে হবে। আপনাকে ওপেনএমপি এবং থ্রেডিং বিল্ডিং ব্লক, বা ওএসএক্স 10.6 "স্নো লেপার্ড" এর আগত "গ্র্যান্ড সেন্ট্রাল" এর মতো সমান্তরালকরণ API সম্পর্কে শিখতে হবে।

আপনার কম্পাইলারটি স্বয়ংক্রিয়ভাবে সমান্তরাল হওয়া উচিত কিনা বা আপনার সংকলক দ্বারা সংকলিত অ্যাপ্লিকেশনগুলির লেখককে যদি একাধিক কোরের সুবিধা গ্রহণের জন্য তার প্রোগ্রামে বিশেষ সিনট্যাক্স বা এপিআই কল যুক্ত করতে হয় তবে আপনার বিবেচনা করা উচিত।


নেট এবং জাভা এর মতো বেশ কয়েকটি জনপ্রিয় ভিএমগুলির কোনও সমস্যা নেই যে তাদের প্রধান জিসি প্রক্রিয়াটি লকগুলিতে আচ্ছাদিত এবং মূলত একক থ্রেডযুক্ত?
মার্কো ভ্যান ডি ভুর্ট

9

প্রতিটি কোর আলাদা মেমরি অঞ্চল থেকে চালায়। আপনার অপারেটিং সিস্টেমটি আপনার প্রোগ্রামে একটি মূল নির্দেশ করবে এবং কোরটি আপনার প্রোগ্রামটি কার্যকর করবে। আপনার প্রোগ্রামটি সচেতন হবে না যে সেখানে একাধিক কোর বা কোন কোর এটি চালাচ্ছে।

কেবল অপারেটিং সিস্টেমের জন্য কোনও অতিরিক্ত নির্দেশ নেই। এই কোরগুলি একক কোর চিপগুলির অনুরূপ। প্রতিটি কোর অপারেটিং সিস্টেমের একটি অংশ চালায় যা পরবর্তী মেমরির এক্সিকিউট করার জন্য তথ্য ইন্টারচেঞ্জের জন্য ব্যবহৃত সাধারণ মেমরি অঞ্চলগুলিতে যোগাযোগ পরিচালনা করবে।

এটি সরলিকরণ তবে এটি কীভাবে করা হয় তার প্রাথমিক ধারণা দেয়। এম্বেডডটকম এ মাল্টিকোর এবং মাল্টিপ্রসেসর সম্পর্কে আরও এই বিষয় সম্পর্কে প্রচুর তথ্য রয়েছে ... এই বিষয়টি খুব দ্রুত জটিল হয়ে যায়!


আমি মনে করি যে এখানে সাধারণভাবে কীভাবে মাল্টিকোর কাজ করে এবং ওএস কতটা প্রভাব ফেলে তা এখানে একটু সাবধানতার সাথে আলাদা করা উচিত। "প্রতিটি কোর আলাদা মেমোরির ক্ষেত্র থেকে সম্পাদন করে" আমার মতে খুব বিভ্রান্তিকর। প্রথম এবং সর্বাগ্রে, নীতিগুলিতে একাধিক কোর ব্যবহার করার প্রয়োজন নেই এবং আপনি সহজেই দেখতে পারেন যে থ্রেডেড প্রোগ্রামের জন্য আপনি দুটি কোরের একই পাঠ্য এবং ডেটা বিভাগগুলিতে দুটি কাজ করতে চান (যখন প্রতিটি কোরকেও স্ট্যাকের মতো পৃথক সংস্থান প্রয়োজন) ।
ভোলকার স্টলজ

@ শিডোইসি এই কারণেই আমার উত্তরে "এটি একটি সরলীকরণ" লেখাটি রয়েছে ।
গেরহার্ড

5

সমাবেশ কোডটি মেশিন কোডে অনুবাদ করবে যা একটি কোরতে কার্যকর করা হবে। আপনি যদি এটি মাল্টিথ্রেড করাতে চান তবে বিভিন্ন কোডে বিভিন্ন প্রসেসরে বিভিন্ন কোড বা কোডের বিভিন্ন টুকরা বিভিন্ন কোডে শুরু করার জন্য আপনাকে অপারেটিং সিস্টেমের আদিম ব্যবহার করতে হবে - প্রতিটি কোর পৃথক থ্রেড কার্যকর করবে। প্রতিটি থ্রেড কেবলমাত্র একটি কোর দেখবে যা এটি বর্তমানে চালানো হচ্ছে।


4
আমি এরকম কিছু বলতে যাচ্ছিলাম, তবে তারপরে ওএস কীভাবে থ্রেডগুলিকে বরাদ্দ দেয়? আমি ভাবছি এখানে কয়েকটি সুবিধামতো সমাবেশ নির্দেশাবলী রয়েছে যা এটি সম্পাদন করে। যদি তা হয় তবে আমি মনে করি যে এটিই উত্তরটি লেখক সন্ধান করছেন।
এ লেভি

এর জন্য কোনও নির্দেশনা নেই, এটি অপারেটিং সিস্টেমের শিডিয়ুলারের দায়িত্ব। উইন 32 এ সেটথ্রেডএফিনিটিমাস্কের মতো অপারেটিং সিস্টেমের কাজ রয়েছে এবং কোড তাদের কল করতে পারে, তবে এটি অপারেটিং সিস্টেমের স্টাফ এবং শিডিয়ুলারকে প্রভাবিত করে, এটি কোনও প্রসেসরের নির্দেশ নয়।
11:48

2
অবশ্যই একটি অপকোড থাকতে হবে অন্যথায় অপারেটিং সিস্টেমটি এটি করতে সক্ষম হবে না।
ম্যাথু হোয়াইট

1
তফসিলের জন্য সত্যিকার অর্থেই একটি ওপোড নয় - এটির চেয়ে অনেক বেশি আপনি প্রসেসর প্রতি ওএসের একটি অনুলিপি পেয়েছেন, একটি মেমরির স্থান ভাগ করে নিচ্ছেন; যখনই কোনও কোর কার্নেলটিতে পুনরায় প্রবেশ করে (সিস্কল বা বিঘ্নিত হয়), পরবর্তী কোন থ্রেডটি চালানো হবে তা স্থির করে মেমরির একই ডাটা স্ট্রাকচারের দিকে নজর দেয়।
pjc50

1
@ এ.ল্যাভি: আপনি যখন এমন কোনও থ্রেড শুরু করেন যা কেবল একটি ভিন্ন কোরকে চালিত করতে দেয় তখন তা তাত্ক্ষণিকভাবে ঘটে না অন্য চলে যায় না। এটির সাধারণ প্রসঙ্গের স্যুইচের মতোই এর প্রসঙ্গটি মেমোরিতে সংরক্ষণ করা হয়েছে। অন্যান্য হার্ডওয়্যার থ্রেডগুলি শিডিয়াল ডেটা স্ট্রাকচারগুলিতে এটির প্রবেশ দেখতে পায় এবং তার মধ্যে একটি অবশেষে সিদ্ধান্ত নেবে যে এটি থ্রেডটি চালাবে। সুতরাং প্রথম কোরের দৃষ্টিকোণ থেকে: আপনি একটি ভাগ করা ডেটা স্ট্রাকচারে লিখবেন এবং শেষ পর্যন্ত অন্য কোনও কোর (হার্ডওয়্যার থ্রেড) এর ওএস কোড এটি লক্ষ্য করবে এবং এটি চালাবে।
পিটার কর্ডস

3

এটি মেশিনের নির্দেশে মোটেই করা হয়নি; কোরগুলি পৃথক সিপিইউ হওয়ার ভান করে এবং একে অপরের সাথে কথা বলার জন্য কোনও বিশেষ ক্ষমতা রাখে না। তাদের যোগাযোগের দুটি উপায় রয়েছে:

  • তারা দৈহিক ঠিকানার স্থান ভাগ করে নেয়। হার্ডওয়্যার ক্যাশে সংহতি পরিচালনা করে, তাই একটি সিপিইউ একটি মেমরি ঠিকানায় লিখেন যা অন্যটি পড়ে।

  • তারা একটি এপিক শেয়ার করে (প্রোগ্রামেবল বিঘ্নিত নিয়ামক)। এটি হ'ল মেমরিটি দৈহিক ঠিকানার জায়গাগুলিতে ম্যাপ করা হয় এবং এটি একটি প্রসেসরের সাহায্যে অন্যকে নিয়ন্ত্রণ করতে, এগুলি চালু বা বন্ধ করতে, বাধা প্রেরণ ইত্যাদি করতে পারে be

http://www.cheesecake.org/sac/smp.html একটি মূর্খ url সহ একটি ভাল রেফারেন্স।


2
তারা আসলে একটি এপিক শেয়ার করে না। প্রতিটি লজিকাল সিপিইউর নিজস্ব একটি থাকে। এপিআইসিগুলি নিজেদের মধ্যে যোগাযোগ করে তবে তারা পৃথক।
নাথান ফেলম্যান

তারা একটি বেসিক উপায়ে সিঙ্ক্রোনাইজ করে (যোগাযোগের পরিবর্তে) এবং তা হ'ল লক উপসর্গ (নির্দেশ "এক্সএইচজি মেম, রেগ" এ একটি অন্তর্নিহিত লক অনুরোধ থাকে) যা লক পিনে চলে যা কার্যকরভাবে তাদের বলছে যে সিপিইউ (আসলে যে কোনও বাস-মাস্টারিং ডিভাইস) বাসে একচেটিয়া অ্যাক্সেস চায়। অবশেষে একটি সিগন্যাল এলোকা (স্বীকৃতি) পিনে ফিরে আসবে সিপিইউকে বলবে যে এটির এখন বাসে একচেটিয়া অ্যাক্সেস রয়েছে। যেহেতু বাহ্যিক ডিভাইসগুলি সিপিইউর অভ্যন্তরীণ কাজের চেয়ে অনেক ধীর গতিতে একটি LOCK / LOCKA সিকোয়েন্সটি সম্পন্ন করতে অনেক শত শত CPU চক্রের প্রয়োজন হতে পারে।
অলিফ ফোরশেল

1

একক- এবং একাধিক-থ্রেডযুক্ত অ্যাপ্লিকেশনের মধ্যে প্রধান পার্থক্যটি হ'ল প্রাক্তনটির একটি স্ট্যাক থাকে এবং পরেরটির প্রতিটি থ্রেডের জন্য একটি থাকে। কোডটি কিছুটা আলাদাভাবে উত্পন্ন হয় যেহেতু সংকলকটি ধরে নিবে যে ডেটা এবং স্ট্যাক সেগমেন্ট রেজিস্টার (ডিএস এবং এসএস) সমান নয়। এর অর্থ এই যে ebp এবং esp রেজিস্টারগুলির মাধ্যমে ইন্ডিরিয়ারেশন এসএস রেজিস্টারে ডিফল্ট হয়ে ডিএস-এ ডিফল্ট হবে না (কারণ ডিএস! = এসএস)। বিপরীতভাবে, অন্যান্য রেজিস্টারগুলির মাধ্যমে ইন্ডিরিয়ারেশন ডিএস-এ ডিফল্ট এসএস-তে ডিফল্ট হয় না।

থ্রেডগুলি ডেটা এবং কোড অঞ্চলগুলি সহ সমস্ত কিছু ভাগ করে দেয়। তারা স্বাচ্ছন্দ্যের রুটিনগুলিও ভাগ করে তাই তারা থ্রেড-নিরাপদ তা নিশ্চিত করুন। এমন একটি প্রক্রিয়া যা র‌্যামে একটি অঞ্চল বাছাই করে জিনিসগুলি গতি বাড়ানোর জন্য একাধিক থ্রেডযুক্ত হতে পারে। থ্রেডগুলি তারপরে একই শারীরিক মেমরি অঞ্চলে ডেটা অ্যাক্সেস, তুলনা এবং অর্ডার এবং একই কোডটি কার্যকর করা হবে তবে বিভিন্ন স্থানীয় ভেরিয়েবলগুলি সাজানোর ক্ষেত্রে তাদের নিজ নিজ অংশটি নিয়ন্ত্রণ করতে হবে। এটি অবশ্যই কারণ থ্রেডগুলির বিভিন্ন স্ট্যাক রয়েছে যেখানে স্থানীয় ভেরিয়েবলগুলি রয়েছে। এই ধরণের প্রোগ্রামিংয়ে কোডটির যত্ন সহকারে সুরের প্রয়োজন হয় যাতে আন্ত-কোর ডেটা সংঘর্ষগুলি (ক্যাশে এবং র‌্যামে) হ্রাস হয় যার ফলস্বরূপ এমন কোড আসে যা কেবল একটির চেয়ে দুটি বা আরও বেশি থ্রেড সহ দ্রুত হয় is অবশ্যই, একটি অন-টিউনযুক্ত কোড প্রায়শই দুটি বা তার বেশিের চেয়ে একটি প্রসেসরের সাথে দ্রুত হয়। ডিবাগ করা আরও চ্যালেঞ্জিং কারণ স্ট্যান্ডার্ড "ইন্ট 3" ব্রেকপয়েন্টটি প্রযোজ্য হবে না কারণ আপনি একটি নির্দিষ্ট থ্রেড বাধাগ্রস্ত করতে চান এবং সেগুলি সবগুলিই নয়। ডিবাগ রেজিস্টার ব্রেকপয়েন্টগুলি যদি না আপনি বাধা দিতে চান এমন নির্দিষ্ট থ্রেডটি নির্বাহ করে নির্দিষ্ট প্রসেসরের উপর সেট না করতে পারেন তবে এই সমস্যার সমাধান করবেন না।

অন্যান্য বহু-থ্রেড কোড প্রোগ্রামের বিভিন্ন অংশে চলমান বিভিন্ন থ্রেডকে জড়িত করতে পারে। এই ধরণের প্রোগ্রামিংয়ের জন্য একই ধরণের সুরের প্রয়োজন হয় না এবং তাই এটি শিখতে খুব সহজ is


0

প্রতিটি মাল্টিপ্রসেসিং-সক্ষম আর্কিটেকচারে যা যুক্ত করা হয়েছে তার আগে সিঙ্গেল-প্রসেসরের বৈকল্পগুলির তুলনায় যা কোরগুলির মধ্যে সিঙ্ক্রোনাইজ করার নির্দেশনা রয়েছে। এছাড়াও, আপনার ক্যাশে সংহতি, ফ্লাশিং বাফার এবং একই ধরণের নিম্ন-স্তরের অপারেশনগুলির সাথে মোকাবিলা করার জন্য নির্দেশাবলী রয়েছে যা কোনও ওএসকে মোকাবেলা করতে হয়। আইবিএম পাওয়ার 6, আইবিএম সেল, সান নায়াগ্রা, এবং ইন্টেল "হাইপারথ্রেডিং" এর সাথে একসাথে বহু বহুবিধ আর্কিটেকচারের ক্ষেত্রেও আপনি থ্রেডের মধ্যে অগ্রাধিকার দেওয়ার জন্য নতুন নির্দেশাবলী দেখতে পেলেন (যেমন কিছুই করার নেই তখন প্রাইসারিটি সেট করা এবং প্রসেসরের ফলস্বরূপ ফলন করা) ।

তবে বেসিক একক থ্রেড শব্দার্থবিজ্ঞান একই, আপনি কেবলমাত্র অন্যান্য কোরগুলির সাথে সিঙ্ক্রোনাইজেশন এবং যোগাযোগ পরিচালনা করতে অতিরিক্ত সুবিধা যুক্ত করেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.