Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

assembly language and optimization [closed]

How can programming in assembly help in achieving optimization

like image 542
Zia ur Rahman Avatar asked Jul 22 '10 17:07

Zia ur Rahman


People also ask

Is assembly language still used 2021?

Today, assembly language is still used for direct hardware manipulation, access to specialized processor instructions, or to address critical performance issues. Typical uses are device drivers, low-level embedded systems, and real-time systems (see § Current usage).

Does an assembler perform optimization?

Assembler does no optimization. It takes your code as is and converts to machine code. Compilers on the other hand can optimize your code; the resulting assembly is already optimized.

Which language is closest to assembly language?

An assembler is a program that takes assembly language code and translates it into the machine language code that can be run on the computer. Assembly language is called a low-level language because it is so close to machine language.


9 Answers

The most likely way programming in assembly can improve your code is by improving you: teaching you more about what is happening at a low level and getting the discipline of optimization can help you make good decisions in higher-level languages.

As far as actually helping one program: as others have noted it's rarely worth it. It's just possible you can use it as a kind of advanced profile-driven optimization: try many variations until you find one that's best on your particular problem.

To start with this: write a program in C or C++ or whatever compiled language you normally use, fire up your debugger, and disassemble a small but nontrivial function, and have a think about why the compiler did what it did. Then try writing a small bit of inline assembler yourself. On modern systems assembly is mostly easily embedded within C rather than done from scratch.

Or alternatively, get a teeny machine like a PIC and make it flash a LED...

like image 95
poolie Avatar answered Oct 10 '22 19:10

poolie


These days, you have to be very good at assembly to beat the compiler.

I can do it any day of the week, but only by viewing the compiler's output first.

And then, if it gains more than a couple of percentage points I'd be surprised.

These days, I only program in assembly when I'm doing something the compiler can't do.

like image 36
Joshua Avatar answered Oct 10 '22 19:10

Joshua


In principle, you can write highly-optimized code in assembly because the compiler is limited to specific, general-purpose optimizations that should apply to many programs, while you can be creative and use your knowledge of this particular program.

To take a simple example, back when I was new to this business compilers were very limited in their ability to optimize register usage. You know that to perform any sort of arithmetic or logical operation, the CPU must generally load one of the values into a register, then perform the operation on the other, then save the result? Like to add two numbers together -- and I'll use a pseudo-assembler here because I don't know what assembly languages you know and I've forgotten most of the details myself -- you'd write something like this:

LOAD A,value1
ADD A,value2
STORE a,destination

Compilers used to generate the loads for every operation. So if your C program said:

 x=x+y;
 z=z+x;

The compiler would generate something like:

LOAD A,x
ADD A,y
STORE A,x
LOAD A,z
ADD A,x
STORE A,z

But a human could observe that by the time we get to the second statement, register A already contains x, and addition is commutative, so we could optimize this to:

LOAD A,x
ADD A,y
STORE A,x
ADD A,z
STORE A,z

Et cetera. One could go through all sorts of tiny micro-optimizations like this. I used to do that all the time back when I was young and the world was green.

But over the years compilers have gotten much smarter, and CPUs have gotten more powerful so the micro-optimizations don't matter as much.

Thus, I haven't written any assembly language code in, wow, probably 15 years. I used to read the assembly generated by the compiler when debugging, sometimes it would give a clue to a subtle problem, but I haven't done that in years now either.

I don't think compilers are even written in assembly any more. Instead, you write the first draft of the compiler in a high level language on some other computer, i.e. you write a cross-compiler to get yourself off the ground.

I suspect the only real use of assembly today is for extremely constrained environments, embedded systems and that sort of thing; and for programs that have to deal intimately with the hardware, like device drivers.

I'd be interested to hear if there are any assembly programmers on this forum who care to tell us why they assembly programmers.

like image 44
Jay Avatar answered Oct 10 '22 21:10

Jay


Programming in assembly won't, in and of itself, optimize your code. The main thing about assembly is that it allows you to have very low-level access and to choose exactly what instructions the processor executes.

Since you won't have some compiler generating the assembly for you, you can perform code optimizations when you write the program yourself, if you know how.

like image 29
burningstar4 Avatar answered Oct 10 '22 21:10

burningstar4


So, you think you are smarter than gcc optimizing compiler? If not, then fughed aboud it (learning assembly for the sake of getting better at optimization). That would be akin to learning Scheme language for the sake of getting better at recursion :)

like image 41
Hamish Grubijan Avatar answered Oct 10 '22 19:10

Hamish Grubijan


In general, the compiler will do a fairly good job at generating optimal code. There are, however, cases where writing your own assembly can result in even more optimized (in terms of space and/or speed) code.

Typically, this happens when there is something that you know about the target system that the compiler doesn't. Compilers are designed to work on a variety of systems; if you want to take advantage of something unique to your target system, sometimes you have to go in and do it yourself. Here's an example. A few months ago, I was writing some code for a MIPS-based embedded system. There are many different types of MIPS CPUs, and some support certain opcodes that others do not. My compiler would generate MIPS code using the set of assembly operations that all MIPS architectures support. However, I knew that my chip could do more. I had a subroutine that needed to count the number of leading zeroes in a 32-bit number. The compiler synthesized this into a loop that took about 10 lines of assembly to do. I re-wrote it in one line by using the CLZ opcode that was designed to do just this. I knew that my chip supported the opcode but the compiler didn't. Admittedly, situations like this aren't very common; when they do pop up, however, it's nice to have enough of a background in assembly to take advantage of them.

like image 33
bta Avatar answered Oct 10 '22 19:10

bta


Sometimes one will need to perform a task which maps particularly well onto some CPU instructions, but does not fit well into any high-level-language constructs. For example, on many processors one may easily perform extended-precision arithmetic using something like:

  add  r0,r4
  addc r1,r5
  addc r2,r6
  addc r3,r7

This will regard r3:r2:r1:r0 and r7:r6:r5:r4 as numbers four words long, adding the second to the first. Four nice easy instructions, any anyone who understands assembly would know what they do. I know of no way to perform the same task in C without it not only generating bigger and slower object code, but also being an incomprehensible mess of source code.

A somewhat more extreme but specialized real-world example: Given two arrays array1[0..63] and array2[0..63], compute array1[0]*array2[0] + array1[1]*array2[1] + array1[2]*array2[2] ... + array1[63]*array2[63]. On a DSP I used, the computation could be done in machine code in about 75 machine cycles (about 67 of which are a repeating MAC instruction). There's no way C code could come anywhere close.

like image 25
supercat Avatar answered Oct 10 '22 21:10

supercat


About the only time I can think of using Assembly language for optimizing code is when you need something very specific, like you need a GPIO on a microcontroller to toggle between high and low exactly every 9 clock cycles. that's too short a time to manage with an interrupt, and higher level language compilers don't normally offer this kind of control over the instruction stream.

like image 43
SingleNegationElimination Avatar answered Oct 10 '22 21:10

SingleNegationElimination


Typically you wouldn't program in assembly. You would program in C, and then look at the generated assembly to see what optimzations (or not) the C compiler made automatically. Adjusting your C code (to allow for better vectorization for example) will allow the compiler to re-arrange code better, which will give you optimized assembly

like image 21
Derek Avatar answered Oct 10 '22 19:10

Derek