Как разработать программу, использующую только одно ядро?

Я хочу знать, как правильно реализовать программу на C ++, в которой у меня есть функция func, которую я хочу выполнить в одном потоке. Я хочу сделать это, потому что я хочу проверить одноядерную скорость моего процессора. Я зациклю эту функцию (func) около 20 раз и запишу время выполнения каждого повторения, затем подведу итоги и получу среднее время выполнения.

#include <thread>

int func(long long x)
{
int div = 0;
for(long i = 1; i <= x / 2; i++)
if(x % i == 0)
div++;
return div + 1;
}

int main()
{
std::thread one_thread (func,100000000);
one_thread.join();
return 0;
}

Итак, в этой программе выполняется ли func на одном конкретном ядре?

Вот исходный код моей программы:

#include <iostream>
#include <thread>
#include <iomanip>
#include <windows.h>
#include "font.h"#include "timer.h"
using namespace std;

#define steps 20

int func(long long x)
{
int div = 0;
for(long i = 1; i <= x / 2; i++)
if(x % i == 0)
div++;
return div + 1;
}

int main()
{
SetFontConsolas(); // Set font consolas
ShowConsoleCursor(false); // Turn off the cursor
timer t;
short int number = 0;
cout << number << "%";
for(int i = 0 ; i < steps ; i++)
{
t.restart(); // start recording
std::thread one_thread (func,100000000);
one_thread.join(); // wait function return
t.stop(); // stop recording
t.record(); // save the time in vector
number += 5;
cout << "\r    ";
cout << "\r" << number << "%";
}
double time = 0.0;
for(int i = 0 ; i < steps ; i++)
time += t.times[i]; // sum all recorded times
time /= steps; // get the average execution time
cout << "\nExecution time: " << fixed << setprecision(4) << time << '\n';
double score = 0.0;
score = (1.0 * 100) / time; // calculating benchmark score
cout << "Score: ";
SetColor(12);
cout << setprecision(2) << score << " pts";
SetColor(15);
cout << "\nPress any key to continue.\n";
cin.get();
return 0;
}

-1

Решение

Нет, у вашей программы есть как минимум два шага: основной и тот, который вы создали для запуска func, Более того, ни один из этих потоков не гарантированно исполняется на particular core, В зависимости от планировщика ОС они могут переключать ядра непредсказуемым образом. Хотя основной поток будет в основном просто ждать. Если вы хотите заблокировать выполнение потока на определенном ядре, вам нужно установить привязку к ядру потока с помощью какого-либо специфичного для платформы метода, такого как SetThreadAffinityMask на винде. Но вам не нужно углубляться в это, потому что в вашем примере нет кода, чувствительного к переключению ядра. Нет даже необходимости создавать отдельный поток, предназначенный для выполнения вычислений.

2

Другие решения

Если ваша программа не имеет нескольких потоков в исходном коде и если компилятор не вставляет автоматическое распараллеливание, программа должна работать на одном ядре (за раз).

Теперь в зависимости от вашего компилятора вы можете использовать соответствующие уровни оптимизации, чтобы гарантировать, что он не распараллеливается.

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

1

Я не думаю, что какой-либо компилятор C ++ использует многоядерный, за вашей спиной. При этом возникнут большие языковые проблемы. Если вы не порождаете потоки и не используете параллельную библиотеку, такую ​​как MPI, программа должна выполняться только на одном ядре.

0
По вопросам рекламы [email protected]