Online Compilers and __cpuid

February 12, 2020

Here is some very minimal code I wrote that gets your (x86) processor’s brand name using the cpuid instruction.

#include <cpuid.h>
#include <cstdio>
#include <cstdint>

int main()
{
	uint32_t Name[4];
	for( uint32_t i = 2; i < 5; )
	{
		__cpuid(0x80000000 | i++, Name[0], Name[1], Name[2], Name[3]);
		fwrite(Name, 16, 1, stdout);
	}
}
main:
        push    rbp
        mov     ebp, 2
        push    rbx
        sub     rsp, 24
.L2:
        mov     eax, ebp
        mov     esi, 16
        add     ebp, 1
        mov     rdi, rsp
        or      eax, -2147483648
   >>>> cpuid

        mov     DWORD PTR [rsp+8], ecx
        mov     rcx, QWORD PTR stdout[rip]
        mov     DWORD PTR [rsp+12], edx
        mov     edx, 1
        mov     DWORD PTR [rsp], eax
        mov     DWORD PTR [rsp+4], ebx
        call    fwrite
        cmp     ebp, 5
        jne     .L2
        add     rsp, 24
        xor     eax, eax
        pop     rbx
        pop     rbp
        ret

Sample one-liner output:

% echo "I2luY2x1ZGUgPGNwdWlkLmg+CiNpbmNsdWRlIDxjc3RkaW8+CiNpbmNsdWRlIDxjc3RkaW50PgppbnQgbWFpbigpe3VpbnQzMl90IE5bNF07Zm9yKHVpbnQzMl90IGk9MjtpPDU7KXtfX2NwdWlkKDB4ODAwMDAwMDAgfCBpKyssIE5bMF0sIE5bMV0sIE5bMl0sIE5bM10pO2Z3cml0ZShOLCAxNiwgMSwgc3Rkb3V0KTt9fQ==" | base64 -d | g++ -x c
++ - -o cpu-name
% ./cpu-name 
Intel(R) Core(TM) i9-7900X CPU @ 3.30GHz

Seems fun enough, but what if we run it on those online compilers like onlinegdb.com?

Cool! onlinegdb.com’s “run code” instance is running off of an AMD EPYC 7501. In some cases, I get an unspecified Intel(R) Xeon(R) CPU @ 2.30GHz, probably due to it running upon some kind of virtualized instance.

Here’s some others:

cpp.sh is running off of an Intel(R) Xeon(R) CPU W3520 @ 2.67GHz

repl.it is Intel(R) Xeon(R) CPU @ 2.30GHz(virtualized)

ideone is Intel(R) Xeon(R) CPU E3-1270 V2 @ 3.50GHz

codechef is Intel(R) Xeon(R) Gold 6140 CPU @ 2.30GHz

Wow. This kinda surprised me. An in-the-wild instance of a pretty-recent Xeon with AVX-512 and everything!

Wandbox is Intel Xeon E312xx (Sandy Bridge)

rextester is Intel(R) Xeon(R) CPU E5-2640 v3 @ 2.60GHz

paiza.io is Intel(R) Xeon(R) Platinum 8124M CPU @ 3.00GHz

Another AVX-512 chip out in the wild

tutorialspoint is Intel(R) Xeon(R) CPU E5-2620 v4

jdoodle is Intel(R) Xeon(R) CPU E5-2630 0 @ 2.30GHz

coliru is AMD Opteron(tm) Processor 4332 HE

codiva is Intel(R) Xeon(R) CPU E5-2676 v3 @ 2.40GHz

GeeksForGeeks is Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz

First time seeing a Cascade Lake server out in the wild.

TIO - Try It Online is Intel(R) Xeon(R) Gold 6140 CPU @ 2.30GHz

Another AVX-512 chip


Lots of Xeon chips are still out in the wild, and surprisingly some of them even have AVX-512. Reason why I point this out is that AVX-512 code is not very accessible hardware at the moment outside of expensive Xeons, i9s, or their recent push into Laptops/Mobile so you can “““rent””” this remote hardware now to get a feel for the new SIMD ISA and see how it runs on these chips and “benchmark” code for yourself without having to pay $2450 on a chip.

Visualizing GL_NV_shader_sm_builtins

Buttery Smooth "10fps"