Thursday, July 25, 2013

Trick to compile GNURadio in MacOS X

Yeeah! this is the key....
# You need macports installed.
# This is the magic command line:
port install gnuradio +full configure.compiler=gcc
;)

Friday, July 19, 2013

Discovering the real number of CPUs in the host server from inside of a VZ container

Researching about ffmpeg enconding in a VZ container I have discovered it is possible to get the real number of CPUs inside of a VZ container. I had to use different flags in compilation time but it works (at least in Proxmox):
/* numcpu.c code is a part of FFMPEG source (libavutil/) ;)
You can play with the definitions in compilation time. Very interesting.
[root@host:~# grep -c processor /proc/cpuinfo
24
[root@build /]# grep -c processor /proc/cpuinfo
1
We have one openvz container with 1 CPU in one server with 24 cpus (cores: 2x cpu 6xcore 2x ht):
[root@build /]# gcc -D_GNU_SOURCE -DHAVE_SYSCTL -DHAVE_SYSCONF -Wall numcpu.c -o numcpu
[root@build /]# ./numcpu
_SC_NPROCESSORS_ONLN CPU num: 1
[root@build /]#
And pay attention:
[root@build /]# gcc -D_GNU_SOURCE -DHAVE_SCHED_GETAFFINITY -Wall numcpu.c -o numcpu
[root@build /]# ./numcpu
HAVE_SCHED_GETAFFINITY CPU num: 24
So it looks like the auto-discovering of CPUs inside of openvz container using the HAVE_SCHED_GETAFFINITY macros (and the sched_setaffinity function) is not ok (or it is very very ok ;)). Be careful. If you are using this method to get resources it could be a bad idea.
*/
#include <stdio.h>
#include <stdlib.h>
#include <features.h>
#include <sched.h>
#if HAVE_SCHED_GETAFFINITY
#ifndef _GNU_SOURCE
# define _GNU_SOURCE
#endif
#include <sched.h>
#endif
#if HAVE_GETPROCESSAFFINITYMASK
#include <windows.h>
#endif
#if HAVE_SYSCTL
#if HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif
#include <sys/types.h>
#include <sys/param.h>
#include <sys/sysctl.h>
#endif
#if HAVE_SYSCONF
#include <unistd.h>
#endif
int av_cpu_count(void)
{
int nb_cpus = 0;
#if HAVE_SCHED_GETAFFINITY && defined(CPU_COUNT)
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
if (!sched_getaffinity(0, sizeof(cpuset), &cpuset))
nb_cpus = CPU_COUNT(&cpuset);
printf ("HAVE_SCHED_GETAFFINITY ");
#elif HAVE_GETPROCESSAFFINITYMASK
DWORD_PTR proc_aff, sys_aff;
if (GetProcessAffinityMask(GetCurrentProcess(), &proc_aff, &sys_aff))
nb_cpus = av_popcount64(proc_aff);
printf ("HAVE_GETPROCESSAFFINITYMASK ");
#elif HAVE_SYSCTL && defined(HW_NCPU)
int mib[2] = { CTL_HW, HW_NCPU };
size_t len = sizeof(nb_cpus);
if (sysctl(mib, 2, &nb_cpus, &len, NULL, 0) == -1)
nb_cpus = 0;
printf ("HW_NCPU ");
#elif HAVE_SYSCONF && defined(_SC_NPROC_ONLN)
nb_cpus = sysconf(_SC_NPROC_ONLN);
printf ("_SC_NPROC_ONLN ");
#elif HAVE_SYSCONF && defined(_SC_NPROCESSORS_ONLN)
nb_cpus = sysconf(_SC_NPROCESSORS_ONLN);
printf ("_SC_NPROCESSORS_ONLN ");
#endif
return nb_cpus;
}
int main(int argc, char *argv[])
{
int numcpu=av_cpu_count();
printf ("CPU num: %d \n", numcpu);
exit(EXIT_SUCCESS);
}
view raw numcpu.c hosted with ❤ by GitHub
:O