কোন কর্টেক্স-এ 72 এ -O0 তবে -O3 সহ সরল টাইট লুপের জন্য চক্রের এই উচ্চ পরিবর্তনশীলতার কারণ কী?


9

আমি কিছু অংশের কোডের জন্য অত্যন্ত সামঞ্জস্যপূর্ণ রানটাইম পাওয়ার আশেপাশে কিছু পরীক্ষা নিরীক্ষা করছি running আমি বর্তমানে যে কোডটি টাইম করছি তা হ'ল একটি সুন্দর স্বেচ্ছাসেবক সিপিইউযুক্ত কাজের চাপ:

int cpu_workload_external_O3(){
    int x = 0;
    for(int ind = 0; ind < 12349560; ind++){
        x = ((x ^ 0x123) + x * 3) % 123456;
    }
    return x;
}

আমি একটি কার্নেল মডিউল লিখেছি যা বাধা নিষ্ক্রিয় করে এবং তারপরে উপরের ফাংশনটির 10 টি ট্রায়াল চালায়, প্রতিটি পরীক্ষার সময় এবং আগে ঘড়ির চক্রের পার্থক্য নিয়ে প্রতিটি সময় নির্ধারণ করে। অন্যান্য বিষয় লক্ষণীয়:

  • মেশিনটি একটি এআরএম কর্টেক্স-এ 72, 4 টি সকেট সহ 4 টি কোর (প্রতিটি তার নিজস্ব এল 1 ক্যাশে সহ)
  • ঘড়ির ফ্রিকোয়েন্সি স্কেলিং বন্ধ
  • হাইপারথ্রেডিং সমর্থিত নয়
  • মেশিনটি কিছু খালি-হাড় সিস্টেম প্রক্রিয়া ব্যতীত কার্যত কিছুই চলছে না

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

প্রকৃতপক্ষে, যখন বেঞ্চমার্কযুক্ত কোডটি সংকলিত হয়েছে -O3, তখন আমি গড়ে প্রায় 135,845,192 ডলারের মধ্যে বেশিরভাগ 200 চক্রের ব্যাপ্তি দেখেছি, বেশিরভাগ পরীক্ষাগুলি ঠিক একই পরিমাণে সময় নেয়। যাইহোক , যখন সংকলন করা হয়েছিল তখন -O0পরিসীমাটি 2 262,710,916 এর মধ্যে 158,386 চক্রের চেয়ে বেশি বেড়েছে। পরিসীমা দ্বারা আমি দীর্ঘতম এবং স্বল্পতম চলমান সময়ের মধ্যে পার্থক্য বোঝাতে চাই mean অধিকন্তু, জন্য -O0কোড, সেখানে নেই অনেক দৃঢ়তা এর বিচারের যা হয় ধীরতম / দ্রুততম - counterintuitively, এক অনুষ্ঠানে দ্রুততম ছিল খুব প্রথম, এবং ধীরতম পর এক ডান ছিল!

সুতরাং : -O0কোডের পরিবর্তনশীলতার উপর এই উচ্চ আপার বাউন্ডের কারণ কী হতে পারে ? সমাবেশটি দেখে মনে হচ্ছে -O3কোডটি একটি রেজিস্টারে সমস্ত কিছু (?) সংরক্ষণ করে, যেখানে -O0কোডটিতে অনেকগুলি রেফারেন্স রয়েছে spএবং তাই মনে হয় এটি মেমরি অ্যাক্সেস করছে। তবে তারপরেও, আমি প্রত্যাশা করব যে সমস্ত কিছু এল 1 ক্যাশে আনা হবে এবং সেখানে একটি সুন্দর নির্বোধের অ্যাক্সেস সময় নিয়ে বসবেন।


কোড

কোডটি বেঞ্চমার্ক করা হচ্ছে উপরের স্নিপেটে রয়েছে। সমাবেশটি নীচে রয়েছে। উভয় সঙ্গে সংকলিত করা হয়েছে gcc 7.4.0ছাড়া কোন পতাকা -O0এবং -O3

-O0

0000000000000000 <cpu_workload_external_O0>:
   0:   d10043ff        sub     sp, sp, #0x10
   4:   b9000bff        str     wzr, [sp, #8]
   8:   b9000fff        str     wzr, [sp, #12]
   c:   14000018        b       6c <cpu_workload_external_O0+0x6c>
  10:   b9400be1        ldr     w1, [sp, #8]
  14:   52802460        mov     w0, #0x123                      // #291
  18:   4a000022        eor     w2, w1, w0
  1c:   b9400be1        ldr     w1, [sp, #8]
  20:   2a0103e0        mov     w0, w1
  24:   531f7800        lsl     w0, w0, #1
  28:   0b010000        add     w0, w0, w1
  2c:   0b000040        add     w0, w2, w0
  30:   528aea61        mov     w1, #0x5753                     // #22355
  34:   72a10fc1        movk    w1, #0x87e, lsl #16
  38:   9b217c01        smull   x1, w0, w1
  3c:   d360fc21        lsr     x1, x1, #32
  40:   130c7c22        asr     w2, w1, #12
  44:   131f7c01        asr     w1, w0, #31
  48:   4b010042        sub     w2, w2, w1
  4c:   529c4801        mov     w1, #0xe240                     // #57920
  50:   72a00021        movk    w1, #0x1, lsl #16
  54:   1b017c41        mul     w1, w2, w1
  58:   4b010000        sub     w0, w0, w1
  5c:   b9000be0        str     w0, [sp, #8]
  60:   b9400fe0        ldr     w0, [sp, #12]
  64:   11000400        add     w0, w0, #0x1
  68:   b9000fe0        str     w0, [sp, #12]
  6c:   b9400fe1        ldr     w1, [sp, #12]
  70:   528e0ee0        mov     w0, #0x7077                     // #28791
  74:   72a01780        movk    w0, #0xbc, lsl #16
  78:   6b00003f        cmp     w1, w0
  7c:   54fffcad        b.le    10 <cpu_workload_external_O0+0x10>
  80:   b9400be0        ldr     w0, [sp, #8]
  84:   910043ff        add     sp, sp, #0x10
  88:   d65f03c0        ret

-O3

0000000000000000 <cpu_workload_external_O3>:
   0:   528e0f02        mov     w2, #0x7078                     // #28792
   4:   5292baa4        mov     w4, #0x95d5                     // #38357
   8:   529c4803        mov     w3, #0xe240                     // #57920
   c:   72a01782        movk    w2, #0xbc, lsl #16
  10:   52800000        mov     w0, #0x0                        // #0
  14:   52802465        mov     w5, #0x123                      // #291
  18:   72a043e4        movk    w4, #0x21f, lsl #16
  1c:   72a00023        movk    w3, #0x1, lsl #16
  20:   4a050001        eor     w1, w0, w5
  24:   0b000400        add     w0, w0, w0, lsl #1
  28:   0b000021        add     w1, w1, w0
  2c:   71000442        subs    w2, w2, #0x1
  30:   53067c20        lsr     w0, w1, #6
  34:   9ba47c00        umull   x0, w0, w4
  38:   d364fc00        lsr     x0, x0, #36
  3c:   1b038400        msub    w0, w0, w3, w1
  40:   54ffff01        b.ne    20 <cpu_workload_external_O3+0x20>  // b.any
  44:   d65f03c0        ret

কার্নেল মডিউল

ট্রায়ালগুলি চলমান কোডটি নীচে। এটি PMCCNTR_EL0প্রতিটি পুনরাবৃত্তির আগে / পরে পঠন করে, একটি অ্যারেতে পার্থক্যগুলি সংরক্ষণ করে এবং শেষ পর্যন্ত সর্বনিম্ন / সর্বোচ্চ বার সমস্ত পরীক্ষাগুলি প্রিন্ট করে। ফাংশনগুলি cpu_workload_external_O0এবং cpu_workload_external_O3বাহ্যিক অবজেক্ট ফাইলে থাকে যা আলাদাভাবে সংকলিত হয় এবং তারপরে সংযুক্ত থাকে।

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

#include "cpu.h"

static DEFINE_SPINLOCK(lock);

void runBenchmark(int (*benchmarkFunc)(void)){
    // Enable perf counters.
    u32 pmcr;
    asm volatile("mrs %0, pmcr_el0" : "=r" (pmcr));
    asm volatile("msr pmcr_el0, %0" : : "r" (pmcr|(1)));

    // Run trials, storing the time of each in `clockDiffs`.
    u32 result = 0;
    #define numtrials 10
    u32 clockDiffs[numtrials] = {0};
    u32 clockStart, clockEnd;
    for(int trial = 0; trial < numtrials; trial++){
        asm volatile("isb; mrs %0, PMCCNTR_EL0" : "=r" (clockStart));
        result += benchmarkFunc();
        asm volatile("isb; mrs %0, PMCCNTR_EL0" : "=r" (clockEnd));

        // Reset PMCCNTR_EL0.
        asm volatile("mrs %0, pmcr_el0" : "=r" (pmcr));
        asm volatile("msr pmcr_el0, %0" : : "r" (pmcr|(((uint32_t)1) << 2)));

        clockDiffs[trial] = clockEnd - clockStart;
    }

    // Compute the min and max times across all trials.
    u32 minTime = clockDiffs[0];
    u32 maxTime = clockDiffs[0];
    for(int ind = 1; ind < numtrials; ind++){
        u32 time = clockDiffs[ind];
        if(time < minTime){
            minTime = time;
        } else if(time > maxTime){
            maxTime = time;
        }
    }

    // Print the result so the benchmark function doesn't get optimized out.
    printk("result: %d\n", result);

    printk("diff: max %d - min %d = %d cycles\n", maxTime, minTime, maxTime - minTime);
}

int init_module(void) {
    printk("enter\n");
    unsigned long flags;
    spin_lock_irqsave(&lock, flags);

    printk("-O0\n");
    runBenchmark(cpu_workload_external_O0);

    printk("-O3\n");
    runBenchmark(cpu_workload_external_O3);

    spin_unlock_irqrestore(&lock, flags);
    return 0;
}

void cleanup_module(void) {
    printk("exit\n");
}

হার্ডওয়্যারের

$ lscpu
Architecture:        aarch64
Byte Order:          Little Endian
CPU(s):              16
On-line CPU(s) list: 0-15
Thread(s) per core:  1
Core(s) per socket:  4
Socket(s):           4
NUMA node(s):        1
Vendor ID:           ARM
Model:               3
Model name:          Cortex-A72
Stepping:            r0p3
BogoMIPS:            166.66
L1d cache:           32K
L1i cache:           48K
L2 cache:            2048K
NUMA node0 CPU(s):   0-15
Flags:               fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid
$ lscpu --extended
CPU NODE SOCKET CORE L1d:L1i:L2 ONLINE
0   0    0      0    0:0:0      yes
1   0    0      1    1:1:0      yes
2   0    0      2    2:2:0      yes
3   0    0      3    3:3:0      yes
4   0    1      4    4:4:1      yes
5   0    1      5    5:5:1      yes
6   0    1      6    6:6:1      yes
7   0    1      7    7:7:1      yes
8   0    2      8    8:8:2      yes
9   0    2      9    9:9:2      yes
10  0    2      10   10:10:2    yes
11  0    2      11   11:11:2    yes
12  0    3      12   12:12:3    yes
13  0    3      13   13:13:3    yes
14  0    3      14   14:14:3    yes
15  0    3      15   15:15:3    yes
$ numactl --hardware
available: 1 nodes (0)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
node 0 size: 32159 MB
node 0 free: 30661 MB
node distances:
node   0
  0:  10

নমুনা পরিমাপ

নীচে কার্নেল মডিউলটির একটি নির্বাহ থেকে কিছু আউটপুট দেওয়া হয়েছে:

[902574.112692] kernel-module: running on cpu 15                                                                                                                                      
[902576.403537] kernel-module: trial 00: 309983568 74097394 98796602 <-- max
[902576.403539] kernel-module: trial 01: 309983562 74097397 98796597                                                                                                                  
[902576.403540] kernel-module: trial 02: 309983562 74097397 98796597                                                                                                                  
[902576.403541] kernel-module: trial 03: 309983562 74097397 98796597
[902576.403543] kernel-module: trial 04: 309983562 74097397 98796597
[902576.403544] kernel-module: trial 05: 309983562 74097397 98796597                                                                                                                  
[902576.403545] kernel-module: trial 06: 309983562 74097397 98796597
[902576.403547] kernel-module: trial 07: 309983562 74097397 98796597
[902576.403548] kernel-module: trial 08: 309983562 74097397 98796597
[902576.403550] kernel-module: trial 09: 309983562 74097397 98796597                                                                                                                  
[902576.403551] kernel-module: trial 10: 309983562 74097397 98796597
[902576.403552] kernel-module: trial 11: 309983562 74097397 98796597
[902576.403554] kernel-module: trial 12: 309983562 74097397 98796597                                                                                                                  
[902576.403555] kernel-module: trial 13: 309849076 74097403 98796630 <-- min
[902576.403557] kernel-module: trial 14: 309983562 74097397 98796597                                                                                                                  
[902576.403558] kernel-module: min time: 309849076
[902576.403559] kernel-module: max time: 309983568                                                                                                                                    
[902576.403560] kernel-module: diff: 134492

প্রতিটি পরীক্ষার জন্য, উল্লিখিত মানগুলি হ'ল: # চক্রের (0x11), # 1 L1D অ্যাক্সেসের (0x04), # এল 1 আই অ্যাক্সেসের (0x14)। আমি এই এআরএম পিএমইউ রেফারেন্সের ১১.৮ ধারা ব্যবহার করছি )।


2
অন্য থ্রেড চলছে? তাদের মেমরির অ্যাক্সেসগুলি বাস ব্যান্ডউইথ এবং ক্যাশে স্পেসের জন্য প্রতিযোগিতার কারণ হতে পারে।
prl

হতে পারে. আমি কোনও কোর বিচ্ছিন্ন করিনি, এবং তারপরেও কার্নেলের থ্রেডটি সকেটের অন্য কোরগুলির একটিতে নির্ধারিত হতে পারে। তবে যদি আমি lscpu --extendedসঠিকভাবে বুঝতে পারি , তবে প্রতিটি কোরের নিজস্ব এল 1 ডেটা এবং নির্দেশাবলীর ক্যাশে রয়েছে এবং তারপরে প্রতিটি সকেটের 4 টি কোরের জন্য একটি ভাগ করা এল 2 ক্যাশে রয়েছে, যতক্ষণ না এল 1 ক্যাশে সমস্ত কিছু করা হয় আমি কোডটি বেশ সুন্দর আশা করব এটির "অনেক বেশি" নিজস্ব বাস (এটি সম্পূর্ণরূপী হওয়া অবধি কেবলমাত্র এটির মূল অংশে চলমান)। যদিও এই স্তরের হার্ডওয়্যার সম্পর্কে আমি বেশি কিছু জানি না।
সেভকো

1
হ্যাঁ, এটি পরিষ্কারভাবে 4 টি সকেট হিসাবে রিপোর্ট করা হয়েছে, তবে এটি কেবল 16-কোর এসসির অভ্যন্তরে আন্তঃসংযোগটি কীভাবে ওয়্যার্ড করা হয় তা কেবল একটি বিষয় হতে পারে। তবে আপনার কাছে ফিজিক্যাল মেশিন আছে? এটির জন্য আপনার কী ব্র্যান্ড এবং মডেল নম্বর রয়েছে? যদি idাকনাটি বন্ধ হয়ে যায় তবে সম্ভবত 4 টি আলাদা আলাদা সকেট রয়েছে কিনা তা আপনি অবশ্যই নিশ্চিত করতে পারেন। আমি কেন দেখছি না কেন এর মধ্যে কোনও বিষয় বিবেচনা করবে, যদিও সম্ভবত মবোর বিক্রেতা / মডেল নম্বর বাদে। আপনার বেঞ্চমার্কটি সম্পূর্ণরূপে একক কোর এবং ক্যাশে গরম থাকা উচিত, সুতরাং এ বিস্ময়কর বিষয়গুলি খালি A72 কোর নিজে এবং এর স্টোর বাফার + স্টোর ফরোয়ার্ডিং।
পিটার

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

1
মজার বিষয় হল, আমি যদি কার্নেল মডিউলটিকে সমস্ত সিপিইউগুলিতে একযোগে এই কোডটি চালিত করি, তবে on_each_cpu()প্রত্যেকে 100 টি ট্রায়াল জুড়ে প্রায় কোনও পরিবর্তনশীলতার খবর দেয়।
সেভকো

উত্তর:


4

সাম্প্রতিক লিনাক্স কার্নেলগুলিতে স্বয়ংক্রিয় NUMA পৃষ্ঠা মাইগ্রেশন প্রক্রিয়াটি পর্যায়ক্রমে টিএলবি এন্ট্রিগুলি গুলি করে যাতে এটি NUMA লোকালটি পর্যবেক্ষণ করতে পারে। টিএলবি পুনরায় লোডগুলি O0 কোডটি ধীর করে দেবে, এমনকি ডেটা এল 1 ডি ক্যাশে থাকলেও।

পৃষ্ঠা স্থানান্তর প্রক্রিয়া কার্নেল পৃষ্ঠাগুলিতে সক্রিয় করা উচিত নয়।

আপনি স্বয়ংক্রিয় NUMA পৃষ্ঠার স্থানান্তর সক্ষম হয়েছে কিনা তা পরীক্ষা করে দেখুন

$ cat /proc/sys/kernel/numa_balancing

এবং আপনি এটি দিয়ে অক্ষম করতে পারেন

$ echo 0 > /proc/sys/kernel/numa_balancing

আমি ইদানীং কিছু সম্পর্কিত পরীক্ষা করছি doing আমি এমন একটি ওয়ার্কলোড চালাচ্ছি যা এল 1 ক্যাশে আরামদায়কভাবে ফিট করে এমন মেমরির বাফারে একগুচ্ছ এলোমেলো অ্যাক্সেস করে। আমি পিছনে পিছনে অনেকগুলি ট্রায়াল চালাই এবং চলমান সময়টি অত্যন্ত সামঞ্জস্যপূর্ণ (আক্ষরিক অর্থে 0.001% এর চেয়ে কম পরিবর্তিত হয়), পর্যায়ক্রমে ছোট্ট একটি upর্ধ্বমুখী স্পাইক ব্যতীত। এই স্পাইকটিতে বেঞ্চমার্কটি কেবল 0.014% বেশি দীর্ঘ চলে। এটি ছোট, তবে এই স্পাইকগুলির প্রতিটিটির একই মাত্রা রয়েছে এবং স্পাইকটি প্রতি 2 সেকেন্ডে প্রায় ঠিক একবারে ঘটে। এই মেশিনটি numa_balancingঅক্ষম করেছে । সম্ভবত আপনি একটি ধারণা আছে?
সেভকো

এটা বের করে আনা। আমি সারাদিন পারফ কাউন্টারগুলিতে ঘুরে বেড়াচ্ছিলাম তবে মূল কারণটি পুরোপুরি সম্পর্কিত নয় এমন কিছু ঘটেছে .. আমি একটি শান্ত মেশিনে টিএমএক্স সেশনে এই পরীক্ষাগুলি চালাচ্ছিলাম। 2 সেকেন্ডের ব্যবধানটি আমার টিএমএক্স স্ট্যাটাসলাইনের রিফ্রেশ ব্যবধানের সাথে হুবহু মিলেছে, যা অন্য কিছু বিষয়গুলির মধ্যে একটি নেটওয়ার্ক অনুরোধ করে .. এটি অক্ষম করে স্পাইকগুলি অদৃশ্য হয়ে যায়। কোনও ভিন্ন
कोर

2

আপনার প্রকরণটি 6 * 10 ^ -4 এর ক্রমে রয়েছে। শোকজনকভাবে 1.3 * 10 ^ -6 এরও বেশি, যখন আপনার প্রোগ্রামটি ক্যাশের সাথে কথা বলছে, এটি অনেকগুলি সিঙ্ক্রোনাইজড ক্রিয়াকলাপে জড়িত। সিঙ্ক্রোনাইজ করা মানে সর্বদা নষ্ট সময়।

একটি মজার বিষয় হ'ল আপনার -O0, -O3 তুলনাটি কীভাবে একটি সাধারণ নিয়মকে নকল করে যে এল 1-ক্যাশে-হিট প্রায় 2x একটি রেজিস্টার রেফারেন্স। আপনার ও ওগুলি আপনার ও 0 এর সময়কালীন 51.70% এ চলে। আপনি যখন নিম্ন / উচ্চতর রূপগুলি প্রয়োগ করেন তখন আমাদের (O3-200) / (O0 + 158386) থাকে, আমরা উন্নতি দেখতে 51.67% দেখতে পাই।

সংক্ষেপে, হ্যাঁ, একটি ক্যাশে কখনও নির্বিচারবাদী হবে না; এবং আপনি যে স্বল্প বৈচিত্রটি দেখেন তা ধীরে ধীরে ডিভাইসের সাথে সিঙ্ক্রোনাইজ করার জন্য কী প্রত্যাশা করা উচিত with কেবলমাত্র অধিকতর ডিস্ট্রিমেন্টিক রেজিস্টার-কেবল মেশিনের সাথে তুলনা করলে এটি কেবলমাত্র একটি বড় বৈকল্পিক।


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

আপনি যখন গরম ডেটা অ্যাক্সেস করেন তখন ক্যাশেগুলি সাধারণত নিয়ন্ত্রক হয়। এগুলি কোর থেকে বিরক্তিকর বোঝা / স্টোর ছাড়াই সংহতি ট্র্যাফিকের অনুমতি দিতে একাধিক পোর্ট করা যেতে পারে। আপনার অনুমান যে অন্যান্য কোরগুলির কারণে ব্যাঘাত ঘটেছে তা প্রশংসনীয় তবে আমি numa_balancingটিএলবি অবৈধতা সম্ভবত এটির ব্যাখ্যা দিয়েছি ।
পিটার

যে কোনও স্নুপিং ক্যাশে একটি নিরবচ্ছিন্ন ক্রম থাকতে হবে যাতে কোনও অনুরোধ স্থগিত করতে হবে। 1 বনাম 2 চক্র অপারেশনে 10 ^ -4 এর ধীরগতির অর্থ প্রতি 10 ^ 5 ক্রিয়াকলাপে একটি ঘড়ি হিচকি। পুরো প্রশ্নটি আসলেই কোনও অপ-বিকল্প, তারতম্যটি ক্ষুদ্র।
2:25 এ mevets
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.