2015-07-05 14 views
0

Недавно я пытался создать простую программу, которая вычисляет FLOPS. Поскольку c++ достаточно быстр, поэтому я думаю, что стоит постараться добиться близкого результата.
Когда я скомпилировал его с помощью плагинов Notepad ++, NppExec, он отлично работает, но я его не создаю. Когда я создаю и запускаю в CodeBlocks, он продолжает итерацию и не завершит процесс. Поэтому я возвращаюсь к блокноту ++ и компилирую его снова, тогда на этот раз, когда я запустил его, он работает нормально, итерация прошла только секунду.
C++ вычислить GFlops

#include<iostream> 
#include<conio.h> 
#include<ctime> 
#include<iomanip> 

using namespace std; 

int main(){ 

    float a=1.0,b=2.0,var,j; 
    double flop; 
    clock_t start,end; 

    cout<<"\n Iterating..."; 

    start=clock(); 

    for(j=0;j<999999999;j++){ // Iterates 999999999 times 
     var=a*b+a/b;    // <-- 5 Flops, or am I wrong? 
    } 

    end=clock(); 

    cout<<"\n\n Calculating..."; 

    double secs=((float)(end-start))/CLOCKS_PER_SEC; 

    flop=999999; // Actually is 999999999, but integer overflow in expression 
    flop=5*(flop*1000+999); // In the brackets I make the value to same as 999999999 
           // Multiply with 5 and basically get Flops here 
    flop/=secs; // To get the Flops in second, multiply with time elapsed 

    string prefix,fstr; 

    if(flop/1000000000>=1||flop/1000000000<1){ 
     flop/=1000000000; 
     prefix="GFLOPS"; 
    } 

    else if(flop/1000000000000>=1){ 
     flop/=1000000000000; 
     prefix="TFLOPS"; 
    } 

    cout<<"\n\n\n Floating-points Operations Per Second\n\n > "<<setprecision(3)<<flop<<" "<<prefix; 
    getch(); 
    return 0; 
    } 

Если вы знаете, как сделать результат более точным, идти вперед, любой ответ будет оценен по достоинству!

ответ

1

Существует много проблем с этим кодом. Первый, вы используете переменную float (j) для поддержания счетчика цикла со строгим условием завершения j<999999999. Вероятно, это причина, по которой цикл может работать вечно. Тип j должен быть интегральным типом, таким как int.

Second, количество флопов в цикле зависит от используемого вами компилятора, параметров компилятора, которые вы передаете компилятору и целевой архитектуре. Лучший способ понять это - увидеть сгенерированный код сборки.

Третьего, первый вызов clock и второй вызов clock может быть заказан из-за оптимизации компилятора рендеринга результатов недействительны. Вы должны убедиться, что они не были переупорядочены, просмотрев код сборки. Способ обеспечения этого зависит от компилятора.

Четвертый, что это значит?

flop=999999; // Actually is 999999999, but integer overflow in expression 

ли компилятор говорит вам, что 999999999 приводит к переполнению? Если да, то как вы используете его в состоянии завершения цикла? Что такое ошибка?

Пятый, это

if(flop/1000000000>=1||flop/1000000000<1){ 

должны, вероятно, будет как этот

if(flop/1000000000>=1){ 

Шестой, весь цикл может быть оптимизирован прочь компилятором, потому что вы не используете var после петля. Вы должны напечатать значение var в конце, чтобы этого не произошло.

Седьмое, выражение a*b+a/b имеет постоянное значение. Так что практически одинаковое значение присваивается var каждой итерации. Компилятор может оптимизировать это для одного постоянного назначения. В этом случае будут выпущены ноль-флопы.

Восьмой, комментарий здесь должен сказать, что разделить не размножаться.

flop/=secs; // To get the Flops in second, multiply with time elapsed 

Девятая, это условие if(flop/1000000000000>=1) должны прийти до этого состояния if(flop/1000000000>=1)

Десятый, в этой строке кода, это называется с плавающей точкой

cout<<"\n\n\n Floating-points Operations Per Second\n\n 

Одиннадцатый, этот номер 999999999 следует определить как константу в начале функции, чтобы ее было легче изменить.

И наконец,, метод, который вы использовали для расчета времени работы, является самым простым и достаточно хорош во многих случаях. Но гораздо более сложные методы гораздо точнее.

+0

** Третий **, не могли бы вы объяснить это проще? ** Четвертое **, когда я назначаю '999999999' на флоп, компилятор показывает ошибку« целочисленное переполнение в выражении ». ** Седьмой **, поэтому вычисление выполняется только один раз ... чтобы исправить это, я собираюсь «var = a * b + a/b', а затем« var = 0 »на каждой итерации? –

+0

Просто убедитесь, что первый вызов 'clock' происходит до цикла, а второй - после него. –

+0

Вам нужно присвоить значение переменной «var», которая меняет каждую итерацию. –

 Смежные вопросы

  • Нет связанных вопросов^_^