আমরা একটি সুপারমাইক্রো এক্স 11 ডিপিএইচ -1 মাদারবোর্ড এবং 2 জিবি র্যামের সাহায্যে 2x জিয়ন স্বর্ণ 6154 সিপিইউ ব্যবহার করে একটি সার্ভার পরীক্ষা করেছি এবং কেবলমাত্র 1 সিপিইউ (খালি একটি সকেট খালি) সাথে চলার তুলনায় মেমরির আশেপাশে কিছু অদ্ভুত পারফরম্যান্সের সমস্যা পেয়েছি, একই দ্বৈত সিপিইউ হ্যাসওয়েল জিয়ন ই 5-2687Wv3 (এই সিরিজের পরীক্ষার জন্য, তবে অন্যান্য ব্রডওয়েলগুলি একইভাবে সঞ্চালন করে), ব্রডওয়েল-ই আই 7 এস এবং স্কাইলেক-এক্স আই 9 এস (তুলনার জন্য)।
আশা করা যায় যে বিভিন্ন মেমকি ফাংশন এবং এমনকি মেমরি বরাদ্দকরণের ক্ষেত্রে দ্রুত মেমরিযুক্ত স্কাইলেক জিয়ন প্রসেসরগুলি হ্যাসওয়েলের চেয়ে দ্রুত সঞ্চালন করবে (নীচের পরীক্ষাগুলিতে আচ্ছাদিত নয়, যেমন আমরা একটি কার্যকারিতা পেয়েছি), তবে পরিবর্তে উভয় সিপিইউ ইনস্টল করা হয়েছে , স্কাইলাক জিয়নস হাসোয়েল জিয়নস হিসাবে প্রায় অর্ধেক গতিতে সঞ্চালন করে, এবং আই -7-6800 কে এর তুলনায় আরও কম। এমনকি অপরিচিত কী, যখন উইন্ডোজ ভার্চুয়ালআলোকএক্সনুমা ব্যবহার করে মেমরি বরাদ্দের জন্য NUMA নোড বরাদ্দ করা হয়, যখন প্লেইন মেমরি কপি ফাংশনগুলি প্রত্যাশিতভাবে রিমোট নোড বনাম বনাম স্থানীয় নোডের উপর খারাপ কার্য সম্পাদন করে, এসএসই, এমএমএক্স এবং অ্যাভিএক্স নিবন্ধগুলি ব্যবহার করে স্থানীয় নোডের চেয়ে দূরবর্তী NUMA নোডের দ্রুত (কী?)। উপরে উল্লিখিত হিসাবে, Skylake Xeons সহ,
আমি নিশ্চিত নই যে এটি মাদারবোর্ড বা সিপিইউতে কোনও বাগ, বা ইউপিআই বনাম কিউপিআই, বা উপরের কোনওটির সাথে নেই, তবে বায়োএস সেটিংসের কোনও সংমিশ্রণ এটি ব্যবহার করে বলে মনে হচ্ছে না। বায়োজে NUMA অক্ষম করা (পরীক্ষার ফলাফলের অন্তর্ভুক্ত নয়) এসএসই, এমএমএক্স এবং অ্যাভিএক্স রেজিস্টারগুলি ব্যবহার করে সমস্ত অনুলিপি ফাংশনের কার্যকারিতা উন্নত করে, তবে অন্যান্য সমস্ত সাধারণ মেমরির অনুলিপি ফাংশনগুলিও বড় ক্ষতির সম্মুখীন হয়।
আমাদের পরীক্ষা প্রোগ্রামের জন্য, আমরা ইনলাইন অ্যাসেম্বলি ফাংশন এবং _mm
অন্তর্নিহিত উভয়টিই ব্যবহার করে পরীক্ষা করেছিলাম , আমরা উইন্ডোজ 10 এর সাথে ভিজ্যুয়াল স্টুডিও 2017 সহ অ্যাসেমবিলি ফাংশনগুলি বাদ দিয়ে সবকিছুর জন্য ব্যবহার করি, যা এমএসভিসি ++ হিসাবে এসএমএস x64 এর জন্য এসএমপি সংকলন করে না, আমরা জিসিসি ব্যবহার করে মিংডাব্লু / এমএসএসি থেকে -c -O2
পতাকা ব্যবহার করে একটি আপত্তি ফাইল তৈরি করুন , যা আমরা এমএসভিসি ++ লিঙ্কারে অন্তর্ভুক্ত করেছি।
যদি সিস্টেমটি NUMA নোড ব্যবহার করে থাকে তবে আমরা প্রতিটি অপারেটরকে প্রতিটি NUMA নোডের জন্য ভার্চুয়ালআলোকএক্সনুমার সাথে মেমরি বরাদ্দকরণের জন্য নতুন পরীক্ষা করি এবং প্রতিটি মেমরি অনুলিপি ফাংশনটির জন্য প্রতিটি 16 এমবি-র একটি সংগ্রহের গড় 100 করে করি এবং আমরা কোন মেমরি বরাদ্দ চালু করি তা ঘোরান ate পরীক্ষার প্রতিটি সেট মধ্যে।
সমস্ত 100 উত্স এবং 100 গন্তব্য বাফারগুলি 64 বাইট প্রান্তিক করা হয় (স্ট্রিমিং ফাংশনগুলি ব্যবহার করে AVX512 পর্যন্ত সামঞ্জস্যের জন্য) এবং উত্স বাফারগুলির জন্য বর্ধনশীল ডেটা এবং একবার গন্তব্য বাফারগুলির জন্য 0 এক্সএফ থেকে শুরু করা হয়।
প্রতিটি কনফিগারেশনের সাথে প্রতিটি মেশিনে গড় প্রতিলিপিগুলির সংখ্যা বৈচিত্রপূর্ণ হয়, কারণ এটি কারওর উপর অনেক দ্রুত এবং অন্যদের তুলনায় অনেক ধীর ছিল।
ফলাফলগুলি নিম্নরূপ ছিল:
32 গিগাবাইট ডিডিআর4-2400 (10 সি / 20 টি, এল 3 ক্যাশে 25 এমবি) সহ সুপারমাইক্রো এক্স 10 ডিএতে হাসওয়েল জিয়ন ই 5-2687Wv3 1 সিপিইউ (1 খালি সকেট )। তবে মনে রাখবেন, বেঞ্চমার্কটি 100 টি জোড় 16 এমবি বাফারের মাধ্যমে ঘুরছে, সুতরাং আমরা সম্ভবত এল 3 ক্যাশে হিট পাচ্ছি না।
---------------------------------------------------------------------------
Averaging 7000 copies of 16MB of data per function for operator new
---------------------------------------------------------------------------
std::memcpy averaging 2264.48 microseconds
asm_memcpy (asm) averaging 2322.71 microseconds
sse_memcpy (intrinsic) averaging 1569.67 microseconds
sse_memcpy (asm) averaging 1589.31 microseconds
sse2_memcpy (intrinsic) averaging 1561.19 microseconds
sse2_memcpy (asm) averaging 1664.18 microseconds
mmx_memcpy (asm) averaging 2497.73 microseconds
mmx2_memcpy (asm) averaging 1626.68 microseconds
avx_memcpy (intrinsic) averaging 1625.12 microseconds
avx_memcpy (asm) averaging 1592.58 microseconds
avx512_memcpy (intrinsic) unsupported on this CPU
rep movsb (asm) averaging 2260.6 microseconds
Well৪ জিবি র্যাম সহ সুপারমাইক্রো এক্স 10 ডিএতে হাসওয়েল ডুয়েল জিয়ন ই 5-2687Wv3 2 সিপিইউ
---------------------------------------------------------------------------
Averaging 6900 copies of 16MB of data per function for VirtualAllocExNuma to NUMA node 0(local)
---------------------------------------------------------------------------
std::memcpy averaging 3179.8 microseconds
asm_memcpy (asm) averaging 3177.15 microseconds
sse_memcpy (intrinsic) averaging 1633.87 microseconds
sse_memcpy (asm) averaging 1663.8 microseconds
sse2_memcpy (intrinsic) averaging 1620.86 microseconds
sse2_memcpy (asm) averaging 1727.36 microseconds
mmx_memcpy (asm) averaging 2623.07 microseconds
mmx2_memcpy (asm) averaging 1691.1 microseconds
avx_memcpy (intrinsic) averaging 1704.33 microseconds
avx_memcpy (asm) averaging 1692.69 microseconds
avx512_memcpy (intrinsic) unsupported on this CPU
rep movsb (asm) averaging 3185.84 microseconds
---------------------------------------------------------------------------
Averaging 6900 copies of 16MB of data per function for VirtualAllocExNuma to NUMA node 1
---------------------------------------------------------------------------
std::memcpy averaging 3992.46 microseconds
asm_memcpy (asm) averaging 4039.11 microseconds
sse_memcpy (intrinsic) averaging 3174.69 microseconds
sse_memcpy (asm) averaging 3129.18 microseconds
sse2_memcpy (intrinsic) averaging 3161.9 microseconds
sse2_memcpy (asm) averaging 3141.33 microseconds
mmx_memcpy (asm) averaging 4010.17 microseconds
mmx2_memcpy (asm) averaging 3211.75 microseconds
avx_memcpy (intrinsic) averaging 3003.14 microseconds
avx_memcpy (asm) averaging 2980.97 microseconds
avx512_memcpy (intrinsic) unsupported on this CPU
rep movsb (asm) averaging 3987.91 microseconds
---------------------------------------------------------------------------
Averaging 6900 copies of 16MB of data per function for operator new
---------------------------------------------------------------------------
std::memcpy averaging 3172.95 microseconds
asm_memcpy (asm) averaging 3173.5 microseconds
sse_memcpy (intrinsic) averaging 1623.84 microseconds
sse_memcpy (asm) averaging 1657.07 microseconds
sse2_memcpy (intrinsic) averaging 1616.95 microseconds
sse2_memcpy (asm) averaging 1739.05 microseconds
mmx_memcpy (asm) averaging 2623.71 microseconds
mmx2_memcpy (asm) averaging 1699.33 microseconds
avx_memcpy (intrinsic) averaging 1710.09 microseconds
avx_memcpy (asm) averaging 1688.34 microseconds
avx512_memcpy (intrinsic) unsupported on this CPU
rep movsb (asm) averaging 3175.14 microseconds
48 গিগাবাইট ডিডিআর4-2666 (18c / 36t, 24.75 এমবি এল 3 ক্যাশে) সহ সুপারমাইক্রো এক্স 11 ডিপিএইচ -1 এ স্কাইলেক জিয়ন গোল্ড 6154 1 সিপিইউ (1 খালি সকেট )
---------------------------------------------------------------------------
Averaging 5000 copies of 16MB of data per function for operator new
---------------------------------------------------------------------------
std::memcpy averaging 1832.42 microseconds
asm_memcpy (asm) averaging 1837.62 microseconds
sse_memcpy (intrinsic) averaging 1647.84 microseconds
sse_memcpy (asm) averaging 1710.53 microseconds
sse2_memcpy (intrinsic) averaging 1645.54 microseconds
sse2_memcpy (asm) averaging 1794.36 microseconds
mmx_memcpy (asm) averaging 2030.51 microseconds
mmx2_memcpy (asm) averaging 1816.82 microseconds
avx_memcpy (intrinsic) averaging 1686.49 microseconds
avx_memcpy (asm) averaging 1716.15 microseconds
avx512_memcpy (intrinsic) averaging 1761.6 microseconds
rep movsb (asm) averaging 1977.6 microseconds
96 গিগাবাইট ডিডিআর4-2666 সহ সুপারমাইক্রো এক্স 11 ডিপিএইচ -1 এ স্কাইলেক জিওন সোনার 6154 2 সিপিইউ
---------------------------------------------------------------------------
Averaging 4100 copies of 16MB of data per function for VirtualAllocExNuma to NUMA node 0(local)
---------------------------------------------------------------------------
std::memcpy averaging 3131.6 microseconds
asm_memcpy (asm) averaging 3070.57 microseconds
sse_memcpy (intrinsic) averaging 3297.72 microseconds
sse_memcpy (asm) averaging 3423.38 microseconds
sse2_memcpy (intrinsic) averaging 3274.31 microseconds
sse2_memcpy (asm) averaging 3413.48 microseconds
mmx_memcpy (asm) averaging 2069.53 microseconds
mmx2_memcpy (asm) averaging 3694.91 microseconds
avx_memcpy (intrinsic) averaging 3118.75 microseconds
avx_memcpy (asm) averaging 3224.36 microseconds
avx512_memcpy (intrinsic) averaging 3156.56 microseconds
rep movsb (asm) averaging 3155.36 microseconds
---------------------------------------------------------------------------
Averaging 4100 copies of 16MB of data per function for VirtualAllocExNuma to NUMA node 1
---------------------------------------------------------------------------
std::memcpy averaging 5309.77 microseconds
asm_memcpy (asm) averaging 5330.78 microseconds
sse_memcpy (intrinsic) averaging 2350.61 microseconds
sse_memcpy (asm) averaging 2402.57 microseconds
sse2_memcpy (intrinsic) averaging 2338.61 microseconds
sse2_memcpy (asm) averaging 2475.51 microseconds
mmx_memcpy (asm) averaging 2883.97 microseconds
mmx2_memcpy (asm) averaging 2517.69 microseconds
avx_memcpy (intrinsic) averaging 2356.07 microseconds
avx_memcpy (asm) averaging 2415.22 microseconds
avx512_memcpy (intrinsic) averaging 2487.01 microseconds
rep movsb (asm) averaging 5372.98 microseconds
---------------------------------------------------------------------------
Averaging 4100 copies of 16MB of data per function for operator new
---------------------------------------------------------------------------
std::memcpy averaging 3075.1 microseconds
asm_memcpy (asm) averaging 3061.97 microseconds
sse_memcpy (intrinsic) averaging 3281.17 microseconds
sse_memcpy (asm) averaging 3421.38 microseconds
sse2_memcpy (intrinsic) averaging 3268.79 microseconds
sse2_memcpy (asm) averaging 3435.76 microseconds
mmx_memcpy (asm) averaging 2061.27 microseconds
mmx2_memcpy (asm) averaging 3694.48 microseconds
avx_memcpy (intrinsic) averaging 3111.16 microseconds
avx_memcpy (asm) averaging 3227.45 microseconds
avx512_memcpy (intrinsic) averaging 3148.65 microseconds
rep movsb (asm) averaging 2967.45 microseconds
এসইএসওজি আরজি র্যাম্পেজ ষষ্ঠ এক্সট্রিমের উপর স্কাইলাক-এক্স i9-7940X 32 জিবি ডিডিআর 4-4266 (14c / 28t, এল 3 ক্যাশে 19.25 এমবি) (ওভারক্লকড 3.8GHz / 4.4GHz টার্বো, ডিডিআর 4040MHz, টার্গেট এভিএক্স ফ্রিকোয়েন্সি 3737MHz, টার্গেট AVX- 512 ফ্রিকোয়েন্সি 3535MHz, টার্গেট ক্যাশে ফ্রিকোয়েন্সি 2424MHz)
---------------------------------------------------------------------------
Averaging 6500 copies of 16MB of data per function for operator new
---------------------------------------------------------------------------
std::memcpy averaging 1750.87 microseconds
asm_memcpy (asm) averaging 1748.22 microseconds
sse_memcpy (intrinsic) averaging 1743.39 microseconds
sse_memcpy (asm) averaging 3120.18 microseconds
sse2_memcpy (intrinsic) averaging 1743.37 microseconds
sse2_memcpy (asm) averaging 2868.52 microseconds
mmx_memcpy (asm) averaging 2255.17 microseconds
mmx2_memcpy (asm) averaging 3434.58 microseconds
avx_memcpy (intrinsic) averaging 1698.49 microseconds
avx_memcpy (asm) averaging 2840.65 microseconds
avx512_memcpy (intrinsic) averaging 1670.05 microseconds
rep movsb (asm) averaging 1718.77 microseconds
24 জিবি ডিডিআর4-2400 (6 সি / 12 টি, এল এম ক্যাশের 15 এমবি) সহ ASUS X99 এ ব্রডওয়েল i7-6800k
---------------------------------------------------------------------------
Averaging 64900 copies of 16MB of data per function for operator new
---------------------------------------------------------------------------
std::memcpy averaging 2522.1 microseconds
asm_memcpy (asm) averaging 2615.92 microseconds
sse_memcpy (intrinsic) averaging 1621.81 microseconds
sse_memcpy (asm) averaging 1669.39 microseconds
sse2_memcpy (intrinsic) averaging 1617.04 microseconds
sse2_memcpy (asm) averaging 1719.06 microseconds
mmx_memcpy (asm) averaging 3021.02 microseconds
mmx2_memcpy (asm) averaging 1691.68 microseconds
avx_memcpy (intrinsic) averaging 1654.41 microseconds
avx_memcpy (asm) averaging 1666.84 microseconds
avx512_memcpy (intrinsic) unsupported on this CPU
rep movsb (asm) averaging 2520.13 microseconds
অ্যাসেম্বলি ফাংশনগুলি জাইন-লিবাসের ফাস্ট_মেমসিপি থেকে প্রাপ্ত, বেশিরভাগ ক্ষেত্রে কেবল এমএসভিসি ++ এর অপটিমাইজারের সাথে তুলনা করার জন্য ব্যবহৃত হয়।
পরীক্ষার জন্য সোর্স কোডটি https://github.com/marc রাসায়নিকizzi / memcpy_test এ উপলব্ধ (পোস্টটি দেওয়ার জন্য এটি কিছুটা দীর্ঘ)
অন্য কারও মধ্যে এটি চালানো হয়েছে বা কেন এমনটি হতে চলেছে সে সম্পর্কে কারও অন্তর্দৃষ্টি রয়েছে?
আপডেট 2018-05-15 13: 40EST
পিটার কর্ডেসের পরামর্শ অনুসারে, আমি প্রিফেচড বনাম প্রিফেটেডের তুলনা করার জন্য পরীক্ষাটি আপডেট করেছি এবং এনটি স্টোর বনাম নিয়মিত স্টোরগুলি তুলনা করেছি এবং প্রতিটি ফাংশনে প্রিফেচিং টিউন করেছি ( প্রিফেচিংয়ের লেখার সাথে আমার কোনও অর্থবহ অভিজ্ঞতা নেই, তাই যদি আমি এই সাথে কোনো ভুল তৈরি করছি, আমাকে দয়া করে এবং আমি সেই অনুযায়ী পরীক্ষার সামঞ্জস্য করব। পূর্বআনয়ন, একটা প্রভাব আছে তাই খুব অন্তত এটা কিছু করছে এ )। এই পরিবর্তনগুলি সোর্স কোডটি খুঁজছেন এমন কারও জন্য আমি আগে তৈরি গিটহাব লিঙ্কের সর্বশেষ সংশোধনীতে প্রতিফলিত হয়।
আমিও একজন SSE4.1 আমার মনে জুড়েছেন যেহেতু SSE4.1 আমি পূর্বে কোন খুঁজে পাচ্ছি না _mm_stream_load
(আমি বিশেষভাবে ব্যবহৃত _mm_stream_load_si128
) সঙ্গে SSE ফাংশন, তাই sse_memcpy
এবং sse2_memcpy
সম্পূর্ণরূপে NT তে দোকানে ব্যবহার করছেন না হতে পারে, এবং সেইসাথে avx_memcpy
ফাংশন AVX2 ফাংশন ব্যবহার স্ট্রিম লোডিংয়ের জন্য।
আমি খাঁটি স্টোর এবং খাঁটি লোড অ্যাক্সেসের নিদর্শনগুলির জন্য এখনও পরীক্ষা না করাকে বেছে নিয়েছি, কেননা আমি নিশ্চিত না যে খাঁটি স্টোরটি অর্থবহ হতে পারে, যেমন যে রেজিস্টারগুলিতে এটি অ্যাক্সেস করা হয়েছে তা লোড না করে ডেটা অর্থহীন এবং যাচাইযোগ্য নয়।
নতুন পরীক্ষার সাথে আকর্ষণীয় ফলাফলগুলি ছিল যে শিওন স্কাইলেক ডুয়াল সকেট সেটআপে এবং কেবলমাত্র সেই সেটআপে, স্টোর ফাংশনগুলি 16 এমবি মেমরির অনুলিপি করার জন্য এনটি স্ট্রিমিং ফাংশনগুলির তুলনায় প্রকৃতপক্ষে দ্রুততর ছিল। পাশাপাশি শুধুমাত্র যে সেটআপ উপর পাশাপাশি (এবং শুধুমাত্র এলএলসি সঙ্গে অগ্রিম নিয়ে BIOS- এ সক্ষম করা থাকে), কিছু পরীক্ষা prefetchnta (SSE, SSE4.1) উভয় prefetcht0 এবং কোন অগ্রিম নিয়ে outperforms।
এই নতুন পরীক্ষার কাঁচা ফলাফল পোস্টে যুক্ত করার জন্য খুব দীর্ঘ, সুতরাং সেগুলি সোর্স কোডের নীচে একই গিট রিপোজিটরিতে পোস্ট করা হয় results-2018-05-15
আমি এখনও বুঝতে পারছি না কেন এনটি স্টোরগুলি স্ট্রিমিংয়ের জন্য, রিমোট NUMA নোডটি স্কাইলেক এসএমপি সেটআপের অধীনে দ্রুততর, যদিও নিয়মিত স্টোরগুলি ব্যবহার করা স্থানীয় NUMA নোডের চেয়ে এখনও দ্রুত
prefetchnta
এবং এনটি স্টোর ব্যবহার করছে ! এটি আপনার প্রশ্নটি বাদ দিয়ে একটি বিশাল গুরুত্বপূর্ণ ঘটনা! দেখুন আমার মনে জন্য উন্নত REP MOVSB ERMSB আরো আলোচনার জন্য rep movsb
বনাম নিয়মিত ভেক্টর দোকানে বনাম NT তে ভেক্টর দোকানে। এমএমএক্স বনাম এসএসইর চেয়ে এর সাথে জগাখিচুড়ি করা আরও কার্যকর হবে। সম্ভবত কেবলমাত্র AVX এবং / অথবা AVX512 ব্যবহার করুন এবং নিয়মিত বনাম চেষ্টা করুন, এবং / অথবা এসডাব্লু প্রিফেচ ছেড়ে চলে যান।
prefetchnta
এল 3 এর পাশাপাশি এল 2 কে বাইপাস করে (কারণ এল 3 অ-অন্তর্ভুক্ত), তাই এটি প্রিফেচ দূরত্বের প্রতি আরও সংবেদনশীল (খুব দেরী হয়ে গেছে এবং কেবল ডি এলএএম থেকে ডেটা আবার সমস্ত পথে আসতে হবে, কেবল এল 3 নয়), সুতরাং এটি আরও "ভঙ্গুর" ( ডান দূরত্ব টিউন করার জন্য সংবেদনশীল)। আমি প্রস্থানটি সঠিকভাবে পড়ছি তবে আপনার প্রিফেচ দূরত্বগুলি বেশ কম দেখায়, যদিও 500 বাইটের নিচে। @ এসকেএক্সে মিস্টিয়ালের পরীক্ষা করে দেখা গেছে যে prefetchnta
সেই উড়ানের উপর একটি বড় ধীরগতি হতে পারে ), এবং তিনি এটির প্রস্তাব দেন না।