"I wuz in ur um-puter, eating ur loopz."
I don't know how MSVC handles things, but generally there are other ways to prevent unwanted benchmark optimizations.
Using volatile is almost never necessary, and very often has different implications to what was intended. Just one example, quoting gcc.info:
Accesses to non-volatile objects are not ordered with respect to volatile accesses. You cannot use a volatile object as a memory barrier to order a sequence of writes to non-volatile memory.
Usually, a barrier of some sort is indicated. With gcc/icc/clang, the following optimization barrier should work:
#define barrier() asm volatile("": : :"memory")
(Here the volatile may be due to some compiler bugs.)
The ways to prevent a compiler of being too smart:
- Put the test routine(s) in separate files ("compilation units"), link together. But nowadays we can have link time optimization (-flto), so care must be taken (incremental linking for those parts that want lto).
- Mark your test routines with __attribute__((__noinline__)), so they don't get inlined. Result should be similar to having them in separate units. However, this does NOT prevent e.g. clang determining that the function is a nop, and optimizing it out!
- Use optimization barrier(s) in the loop and/or test routine. This will make sure the loop stays, even if the body is a nop. Barrier in the test routine might be necessary, lest the compiler discover and hoist a "const" function.
- Have the main loop calculate some sort of result. In other words, the program as a whole needs to have a side effect. E.g. if the test routine returns int, one might compute a checksum and print that in the end; will also serve as verification.
So, probably it's best to use both noinline attribute and an optimization barrier.
Now, getting back to the original topic. Lcm with 4096 means simply to have twelve zeroes at the end. I'd code it like this:
$n <<= 1 while $n & 0xfff;
(Counting trailing zeroes can also be optimized. Some x86 (Haswell) have an instruction for that.
Wikipedia links to
Bit Twiddling Hacks; there are other sites and books on the topic.)
Update: added the 4th clause to above list.
Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
Read Where should I post X? if you're not absolutely sure you're posting in the right place.
Please read these before you post! —
Posts may use any of the Perl Monks Approved HTML tags:
- a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
| |
For: |
|
Use: |
| & | | & |
| < | | < |
| > | | > |
| [ | | [ |
| ] | | ] |
Link using PerlMonks shortcuts! What shortcuts can I use for linking?
See Writeup Formatting Tips and other pages linked from there for more info.