คำถามติดแท็ก assembly

คำถามการเขียนโปรแกรมแอสเซมบลีภาษา (asm) โปรดมั่นใจว่าแท็กด้วยโปรเซสเซอร์และ / หรือชุดคำสั่งที่คุณใช้รวมถึงแอสเซมเบลอร์ คำเตือน: สำหรับแอสเซมบลี. NET ให้ใช้แท็ก [.net-assembly] แทน สำหรับ Java ASM ให้ใช้แท็ก [java-bytecode-asm] แทน

12
ทำไม GCC จึงไม่ปรับ a * a * a * a * a ถึง (a * a * a) * (a * a * a)?
ฉันกำลังทำการเพิ่มประสิทธิภาพเชิงตัวเลขในแอปพลิเคชันทางวิทยาศาสตร์ สิ่งหนึ่งที่ฉันสังเกตเห็นคือ GCC จะเพิ่มประสิทธิภาพการโทรpow(a,2)โดยรวบรวมมันเข้าไปa*aแต่การโทรpow(a,6)นั้นไม่ได้รับการปรับปรุงและจะเรียกฟังก์ชั่นห้องสมุดpowซึ่งทำให้ประสิทธิภาพช้าลงอย่างมาก (ตรงกันข้ามIntel C ++ Compiler ที่สามารถเรียกทำงานiccได้จะกำจัดการเรียกใช้ไลบรารีpow(a,6)) สิ่งที่ฉันอยากรู้คือเมื่อฉันแทนที่pow(a,6)ด้วยการa*a*a*a*a*aใช้ GCC 4.5.1 และตัวเลือก " -O3 -lm -funroll-loops -msse4" จะใช้ 5 mulsdคำสั่ง: movapd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 ในขณะที่ถ้าฉันเขียน(a*a*a)*(a*a*a)มันจะผลิต movapd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd …

14
<เร็วกว่า <= หรือไม่
คือเร็วกว่าif( a &lt; 901 )if( a &lt;= 900 ) ไม่เหมือนกับตัวอย่างง่ายๆนี้ แต่มีการเปลี่ยนแปลงประสิทธิภาพเล็กน้อยในรหัสซับซ้อนของลูป ฉันคิดว่ามันต้องทำอะไรบางอย่างกับรหัสเครื่องที่สร้างขึ้นในกรณีที่มันเป็นจริง

10
การแทนที่ตัวนับลูป 32 บิตเป็น 64 บิตจะนำเสนอการเบี่ยงเบนประสิทธิภาพที่บ้าคลั่งด้วย _mm_popcnt_u64 บน Intel CPUs
ฉันกำลังมองหาวิธีที่เร็วที่สุดในการจัดpopcountเก็บข้อมูลขนาดใหญ่ ฉันพบลักษณะพิเศษที่แปลกมาก : การเปลี่ยนตัวแปรลูปจากunsignedเป็นuint64_tทำให้ประสิทธิภาพลดลง 50% บนพีซีของฉัน เกณฑ์มาตรฐาน #include &lt;iostream&gt; #include &lt;chrono&gt; #include &lt;x86intrin.h&gt; int main(int argc, char* argv[]) { using namespace std; if (argc != 2) { cerr &lt;&lt; "usage: array_size in MB" &lt;&lt; endl; return -1; } uint64_t size = atol(argv[1])&lt;&lt;20; uint64_t* buffer = new uint64_t[size/8]; char* charbuffer = …

11
รหัส C ++ สำหรับการทดสอบการคาดคะเนของ Collatz เร็วกว่าชุดประกอบที่เขียนด้วยมือ - ทำไม?
ฉันเขียนโซลูชันทั้งสองนี้สำหรับProject Euler Q14ในแอสเซมบลีและใน C ++ พวกมันเหมือนกันกับวิธีเดรัจฉานแรงแบบเดียวกันสำหรับการทดสอบการคาดคะเนของโคลลาตซ์ โซลูชันการประกอบถูกประกอบด้วย nasm -felf64 p14.asm &amp;&amp; gcc p14.o -o p14 คอมไพล์ด้วย C ++ g++ p14.cpp -o p14 การชุมนุม p14.asm section .data fmt db "%d", 10, 0 global main extern printf section .text main: mov rcx, 1000000 xor rdi, rdi ; max i xor rsi, rsi …


4
ฉันจะประสบความสำเร็จสูงสุดทางทฤษฎีของ 4 FLOPs ต่อรอบได้อย่างไร
ประสิทธิภาพสูงสุดในเชิงทฤษฎีของการดำเนินการจุดลอย 4 จุด (ความแม่นยำสองเท่า) ต่อรอบสามารถทำได้บนซีพียู x86-64 ที่ทันสมัยของ Intel? เท่าที่ฉันเข้าใจมันใช้เวลาสามรอบสำหรับSSE addและห้ารอบเพื่อmulให้เสร็จสมบูรณ์บน CPU Intel ส่วนใหญ่ที่ทันสมัย ​​(ดูตัวอย่าง'Instruction Tables' ของ Agner Fog ) เนื่องจากการส่งไปป์ไลน์หนึ่งสามารถรับปริมาณงานหนึ่งaddต่อรอบหากอัลกอริทึมมีการสรุปอิสระอย่างน้อยสามครั้ง เนื่องจากเป็นจริงสำหรับแพ็กเกจaddpdรวมถึงaddsdรุ่นสเกลาร์และรีจิสเตอร์ SSE สามารถมีปริมาณงานสองdoubleรายการได้มากถึงสอง flops ต่อรอบ นอกจากนี้ดูเหมือนว่า (แม้ว่าฉันจะไม่เห็นเอกสารที่ถูกต้องเกี่ยวกับเรื่องนี้) addและmulสามารถดำเนินการในแบบคู่ขนานโดยให้ทรูพุตสูงสุดตามทฤษฎีของสี่ flops ต่อรอบ อย่างไรก็ตามฉันไม่สามารถจำลองประสิทธิภาพนั้นด้วยโปรแกรม C / C ++ อย่างง่าย ความพยายามที่ดีที่สุดของฉันส่งผลให้ประมาณ 2.7 flops / รอบ หากใครสามารถมีส่วนร่วม C / C ++ หรือโปรแกรมแอสเซมเบลอร์ที่แสดงให้เห็นถึงประสิทธิภาพสูงสุดที่จะได้รับการชื่นชมอย่างมาก ความพยายามของฉัน: #include &lt;stdio.h&gt; …

30
การประกอบเร็วกว่า C เมื่อใด
หนึ่งในเหตุผลที่ระบุไว้สำหรับการทราบแอสเซมเบลอร์คือในบางครั้งมันสามารถใช้ในการเขียนรหัสที่จะมีประสิทธิภาพมากกว่าการเขียนโค้ดนั้นในภาษาระดับสูงโดยเฉพาะอย่างยิ่ง C แต่ผมเคยได้ยินยังระบุไว้หลายครั้งแล้วว่าถึงแม้ว่ามันจะไม่ได้เป็นเท็จอย่างสิ้นเชิงกรณีที่ผู้ประกอบสามารถจริงจะนำมาใช้เพื่อสร้างรหัส performant มากขึ้นมีทั้งหายากมากและต้องใช้ความรู้จากผู้เชี่ยวชาญและประสบการณ์เกี่ยวกับการชุมนุม คำถามนี้ไม่ได้เกี่ยวกับข้อเท็จจริงที่ว่าคำสั่งแอสเซมเบลอร์จะเป็นแบบเฉพาะเครื่องจักรและไม่ใช่แบบพกพาหรือด้านอื่น ๆ ของแอสเซมเบลอร์ มีเหตุผลที่ดีมากมายในการรู้จักการประกอบนอกเหนือจากนี้แน่นอน แต่นี่เป็นคำถามที่เฉพาะเจาะจงเพื่อชักชวนตัวอย่างและข้อมูลไม่ใช่การสนทนาที่เพิ่มขึ้นของผู้ประกอบการกับภาษาระดับสูง ทุกคนสามารถให้ตัวอย่างเฉพาะของกรณีที่การชุมนุมจะเร็วกว่ารหัส C ที่เขียนดีโดยใช้คอมไพเลอร์ที่ทันสมัยและคุณสามารถสนับสนุนการเรียกร้องที่มีหลักฐานการทำโปรไฟล์? ฉันค่อนข้างมั่นใจว่ากรณีเหล่านี้มีอยู่จริง แต่ฉันต้องการทราบอย่างแน่ชัดว่าคดีเหล่านี้เป็นความลับอย่างไรเพราะมันดูเหมือนจะเป็นประเด็นของความขัดแย้ง
475 c  performance  assembly 

17
คุณจะรับเอาต์พุตแอสเซมเบลอร์จากแหล่ง C / C ++ เป็น gcc ได้อย่างไร
คนเราจะทำสิ่งนี้ได้อย่างไร หากฉันต้องการวิเคราะห์ว่ามีบางสิ่งที่รวบรวมได้ฉันจะได้รับรหัสแอสเซมบลีที่ปล่อยออกมาได้อย่างไร
379 c++  c  debugging  gcc  assembly 

4
เหตุใด Java จึงเปิดสวิตช์ int ที่ต่อเนื่องกันจึงปรากฏว่าทำงานเร็วขึ้นพร้อมกับเคสเพิ่มเติม
ฉันกำลังทำงานกับโค้ด Java บางตัวซึ่งจำเป็นต้องปรับให้เหมาะสมอย่างมากเนื่องจากมันจะทำงานในฟังก์ชั่นฮ็อตที่มีการเรียกใช้หลาย ๆ จุดในลอจิกโปรแกรมหลักของฉัน เป็นส่วนหนึ่งของรหัสนี้เกี่ยวข้องกับการคูณdoubleตัวแปรโดย10ยกพลไม่ใช่เชิงลบint exponents วิธีหนึ่งที่รวดเร็ว (แก้ไข: แต่ไม่ใช่วิธีที่เร็วที่สุดโปรดดูอัปเดตที่ 2 ด้านล่าง) เพื่อรับค่าที่คูณได้switchในexponent: double multiplyByPowerOfTen(final double d, final int exponent) { switch (exponent) { case 0: return d; case 1: return d*10; case 2: return d*100; // ... same pattern case 9: return d*1000000000; case 10: return d*10000000000L; // ... …

10
ใช้ GCC เพื่อสร้างชุดประกอบที่อ่านได้หรือไม่
ฉันสงสัยว่าจะใช้GCCในไฟล์ต้นฉบับ C ของฉันเพื่อถ่ายโอนรหัสเครื่องช่วยจำรุ่นใดเพื่อที่ฉันจะได้เห็นว่าโค้ดของฉันรวบรวมอะไร คุณสามารถทำได้ด้วย Java แต่ฉันไม่สามารถหาวิธีที่มี GCC ฉันกำลังพยายามเขียนวิธี C อีกครั้งในการชุมนุมและดูว่า GCC ทำมันได้อย่างไรจะช่วยได้มาก
256 c  gcc  assembly 

3
retpoline คืออะไรและทำงานอย่างไร
เพื่อลดกับเคอร์เนลหรือหน่วยความจำการเปิดเผยกระบวนการข้าม (คนปีศาจโจมตี), ลินุกซ์เคอร์เนล1จะได้รับการรวบรวมกับตัวเลือกใหม่ , -mindirect-branch=thunk-externแนะนำให้รู้จักกับgccการดำเนินการโทรทางอ้อมผ่านสิ่งที่เรียกว่าretpoline สิ่งนี้ดูเหมือนจะเป็นคำที่ประดิษฐ์ขึ้นใหม่เนื่องจากการค้นหาของ Google เปิดใช้งานเมื่อไม่นานมานี้เท่านั้น (โดยทั่วไปแล้วทั้งหมดในปี 2561) retpoline คืออะไรและป้องกันการเปิดเผยข้อมูลเคอร์เนลล่าสุดได้อย่างไร 1มันไม่ได้เป็นลินุกซ์ที่เฉพาะเจาะจง - โครงสร้างที่คล้ายกันหรือเหมือนกันดูเหมือนจะใช้เป็นส่วนหนึ่งของกลยุทธ์การลดผลกระทบในระบบปฏิบัติการอื่น ๆ

10
ภาษาแอสเซมบลีของมัลติคอร์มีลักษณะอย่างไร
กาลครั้งหนึ่งเมื่อต้องการเขียนแอสเซมเบลอร์ x86 คุณจะมีคำแนะนำที่ระบุ "โหลดการลงทะเบียน EDX ด้วยค่า 5", "การเพิ่ม EDX" การลงทะเบียนเป็นต้น ด้วยซีพียูสมัยใหม่ที่มี 4 คอร์ (หรือมากกว่านั้น) ที่ระดับรหัสเครื่องมันดูเหมือนกับซีพียูที่แยกกัน 4 ตัว (เช่นมีเรจิสเตอร์ "EDX" ที่แตกต่างกัน 4 ตัว)? หากเป็นเช่นนั้นเมื่อคุณพูดว่า "การเพิ่มการลงทะเบียน EDX" การพิจารณาการลงทะเบียน EDX ของ CPU ใดจะเพิ่มขึ้น มีแนวคิด "บริบทของ CPU" หรือ "เธรด" ในแอสเซมเบลอร์ x86 หรือไม่? การสื่อสาร / การซิงโครไนซ์ระหว่างแกนทำงานอย่างไร หากคุณกำลังเขียนระบบปฏิบัติการกลไกใดที่จะถูกเปิดเผยผ่านฮาร์ดแวร์เพื่อให้คุณสามารถกำหนดเวลาดำเนินการบนแกนที่ต่างกันได้ เป็นคำสั่งพิเศษที่มีสิทธิพิเศษหรือไม่? หากคุณกำลังเขียนการเพิ่มประสิทธิภาพ VM / คอมไพเลอร์ bytecode สำหรับ CPU …
243 assembly  x86  cpu  multicore  smp 

12
'สลับ' เร็วกว่า 'ถ้า' หรือไม่
เป็นswitchคำสั่งจริงเร็วกว่าifคำสั่ง? ฉันรันโค้ดด้านล่างในคอมไพเลอร์ x64 C ++ ของ Visual Studio 2010 ด้วย/Oxค่าสถานะ: #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; #include &lt;time.h&gt; #define MAX_COUNT (1 &lt;&lt; 29) size_t counter = 0; size_t testSwitch() { clock_t start = clock(); size_t i; for (i = 0; i &lt; MAX_COUNT; i++) { switch (counter % 4 + 1) { …

3
จะรันโปรแกรมโดยไม่มีระบบปฏิบัติการได้อย่างไร?
คุณรันโปรแกรมด้วยตัวเองโดยไม่ต้องใช้ระบบปฏิบัติการได้อย่างไร คุณสามารถสร้างแอสเซมบลีโปรแกรมที่คอมพิวเตอร์สามารถโหลดและรันเมื่อเริ่มต้นเช่นบูตคอมพิวเตอร์จากแฟลชไดรฟ์และรันโปรแกรมที่อยู่บน CPU หรือไม่

16
เป็นไปได้ที่จะ "ถอดรหัส" ไฟล์ Windows .exe หรือไม่ หรืออย่างน้อยก็ดูสภา
เพื่อนของฉันดาวน์โหลดมัลแวร์บางตัวจาก Facebook และฉันอยากรู้ว่ามันทำอะไรโดยไม่ติดเชื้อตัวเอง ฉันรู้ว่าคุณไม่สามารถคอมไพล์ไฟล์. exe ได้ แต่อย่างน้อยฉันสามารถดูในแอสเซมบลีหรือแนบดีบักเกอร์ได้หรือไม่ แก้ไขเพื่อบอกว่าไม่ใช่. NET ที่สามารถเรียกทำงานได้ไม่มีส่วนหัว CLI

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.