LINUX.ORG.RU

Кросплатформенные методы узнавания числа CPU


0

1

А именно те, которые и в windows и в linux.

Проблема в текущий момент в том, что в linux я делаю numCPU = sysconf(_SC_NPROCESSORS_ONLN);

а в windows везде предлагается длинный и запутанный код, который мне совсем не нравится

★★★★★

Последнее исправление: cvs-255 (всего исправлений: 1)

А я вот так:

if(NOT DEFINED PROCESSOR_COUNT)
  set(PROCESSOR_COUNT 2) # by default 2 cores
  set(cpuinfo_file "/proc/cpuinfo")
  if(EXISTS "${cpuinfo_file}")
    file(STRINGS "${cpuinfo_file}" procs REGEX "^processor.: [0-9]+$")
    list(LENGTH procs PROCESSOR_COUNT)
  endif()
endif()
add_definitions(-DTHREAD_NUMBER=${PROCESSOR_COUNT})

Anon
()
Ответ на: комментарий от i-rinat

QThread::idealThreadCount()

А если без перепиливания на QT?

И где сказано, что идеальное количество потоков == количеству процессоров/ядер?

cvs-255 ★★★★★
() автор топика
Последнее исправление: cvs-255 (всего исправлений: 1)
Ответ на: комментарий от cvs-255

А если без перепиливания на Qt?

Это статическая функция. Придётся линковаться с Qt, да. Но тебе же надо простой кроссплатформенности.

И где сказано, что идеальное количество потоков == количеству процессоров/ядер?

http://qt-project.org/doc/qt-4.8/qthread.html#idealThreadCount

P.S. Знаешь, что самое забавное? Я не пользуюсь Qt, я просто нагуглил ответ.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Я не пользуюсь Qt, я просто нагуглил ответ.

Плохой у тебя гугол. У меня лучше: нормальное решение без костылей. А ты говнище всякое советуешь. Еще не хватало в проект пихать всякие культи.

Anon
()
Ответ на: комментарий от cvs-255
$ cat q.cc
#include <Qt/qthread.h>
#include <stdio.h>

int main(void)
{
	printf("%d\n", QThread::idealThreadCount());
	return 0;
}
$ gcc q.cc `pkg-config --cflags --libs QtCore`
$ ./a.out 
8
$ getconf _NPROCESSORS_CONF
8
$
i-rinat ★★★★★
()
Ответ на: комментарий от Anon

У меня лучше: нормальное решение без костылей.

Твоё решение хорошо для тебя, ты запускаешь на той же машине, где и компиляешь. (Да и Windows у тебя явно нет).

А ты говнище всякое советуешь.

А я ещё GLib использую вместо своих хэш-таблиц и динамических массивов. Начал посматривать в сторону g_slice. Я теперь плохой, да?

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

getconf _NPROCESSORS_CONF

Япона мать! Ну почему я об этом только сейчас узнал? Такую портянку на cmake накатал, а это элементарнейшим образом делается!!!

Anon
()
Ответ на: комментарий от i-rinat

Твоё решение хорошо для тебя

Не, я выше для мастдайки привел ссылочку со стака. Там элементарно и элегантно, в отличие от этих культей!

А я ещё GLib использую вместо своих хэш-таблиц и динамических массивов.

Кошмарр! Но, учитывая то, что говТК использует тоже эту дрянь пользует, сойдет.

Я теперь плохой, да?

Еще не совсем. Вот если будешь пользоваться systemd, будешь плохим.

Anon
()
Ответ на: комментарий от Anon

Ну почему я об этом только сейчас узнал?

Век живи, век флуди. :)

i-rinat ★★★★★
()
Ответ на: комментарий от Anon

Не, я выше для мастдайки привел ссылочку со стака. Там элементарно и элегантно, в отличие от этих культей!

То есть вместо библиотеки, которая позволяет это делать одинаково на обеих платформах, ты предлагаешь обвесить код ifdef'ами.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Зато человеку из-за какой-то поделки не придется всякое Г устанавливать! И уж если в линуксе волей-неволей приходится это делать (т.к. почти весь софт писан или на культях, или на говТКах), то в мастдайке своя кухня и незачем туда еще одно Г тащить!

Anon
()
Ответ на: комментарий от i-rinat

предлагаешь обвесить код ifdef'ами.

В данном случае это допустимо, их и так много уже

cvs-255 ★★★★★
() автор топика

Тут нигде не написано, что требуется чистый С, так что на всякий случай:

std::thread::hardware_concurrency();
boost::thread::hardware_concurrency();

DarkEld3r ★★★★★
()

У меня сделано так:

#ifdef WIN32
	SYSTEM_INFO systemInfo;
	GetSystemInfo(&systemInfo);
	return systemInfo.dwNumberOfProcessors;
#elif defined (__APPLE__) || defined(__FreeBSD__)
	int numProcessors = 1;
	size_t size = sizeof(numProcessors);
	sysctlbyname("hw.ncpu", &numProcessors, &size, NULL, 0);
	return numProcessors;
#else
	return get_nprocs_conf();
#endif
abalakin ★★
()
Последнее исправление: abalakin (всего исправлений: 1)
#include <stdio.h>
#include <omp.h>

int main(void) {
        printf("%d\n", omp_get_max_threads());
        return 0;
}
Lavos ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.