Problem z __asm__ volatile w Visual Studio

0

Próbuję zmierzyć prędkość kodu w pewnej pętli:

#include <iostream>
#include <cmath>
#include <stdio.h>
#include <stdint.h>
#include <chrono>

int main()
{
    double a = 0;

    uint64_t k = 4294967295;
    uint64_t x = 4294967295;
    uint64_t result;
    uint64_t counter = 0;

    for(int i=0; i<100; i++)
    {
    auto begin = std::chrono::high_resolution_clock::now();
    for(uint64_t i=0; i<100000000; i++)
    {
    k += x;
    x = x*k;
    x ^= (counter += 1);
    result = (k*x >> 16) ^ x;
    }
    auto end = std::chrono::high_resolution_clock::now();
    auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin);
    printf("Time measured: %.3f seconds.\n", elapsed.count() * 1e-9);
    a = a + (elapsed.count() * 1e-9);
    }
 __asm__ volatile("" : "+g" (result) : : );
std::cout << a/100;
}


I wstawiłem tam asm volatile("" : "+g" (result) : : );, żeby nie dostawać w wyniku samych zerowych czasów wykonania. Niestety, pomimo, że działało to w Code Blocks, to w Visual Studio nie działa, dostaję błąd "asm jest niezdefiniowany". Czy można to jakoś naprawić?

1

Dyrektywy asm nie sa standardowe, i każdy kompilator to ma zrobione po swojemu.
Musisz pogooglać

Tak a propos, czego się spodziewasz po tym volatile na końcu kodu i dlaczego nie natywne C++ ?

3

W dodatku do tego co powiedział @ZrobieDobrze, w kompilatorze Visual Studio na 64 bity, inline asm w ogóle nie jest wspierany.

0

By kompilator nie wyciął result można spróbować zrzutować na void zamiast asma. Ale nie jestem pewien czy zadziała w tym przypadku.

    a = a + (elapsed.count() * 1e-9);
 }
 (void)result;
 std::cout << a/100;
0

By nie wycięło wyniku wyświetl go sobie na końcu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1