LINUX.ORG.RU

getaffinity


0

0

Добрый день!

Натолкнулся на одну проблему с sched_getaffinity, которую пока не могу разрешить.

Имею 2 почти одинаковые Linux-машины:

1)$ uname -a
Linux 2.6.18

$rpm -q glibc
glibc-2.5.1


$gcc --version
gcc (GCC) 4.1.2 20070626

2) $uname -a
Linux 2.6.18-128.2.1

$rpm -q glibc
glibc-2.5-34

$ gcc --version
gcc (GCC) 4.1.2 20080704

Хочу получить маску доступных процессоров с помощью программы get_affinity.c:

#include <sched.h>
#include <stdio.h>
int main() {
unsigned long mask;
unsigned int len = sizeof(mask);

if (sched_getaffinity(0, len, &mask) < 0) {
perror(«sched_getaffinity»);
return -1;
}
printf(«my affinity mask is: %08lx\n», mask);
}

Транслирую ее так:

$ gcc -o get_affinity get_affinity.c

Однако, если на первой машине всё проходит хорошо:

$ ./get_affinity
my affinity mask is: 000000ff

то на второй машине выдается ошибка:

$ ./get_affinity
sched_getaffinity: Invalid argument

Хочу обратиться к специалистам - в чём может быть проблема?

Спасибо.

Хочу обратиться к специалистам - в чём может быть проблема?

В параметрах проблема.

int sched_getaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask);

В Вашем случае sizeof(unsigned long) меньше размера маски соответствия процессоров (которая CPU affinity mask), используемой ядром.

 #include <sched.h>
 #include <stdio.h>
 int main() {
-unsigned long mask;
-unsigned int len = sizeof(mask);
+cpu_set_t mask;
+size_t len = sizeof(mask);
 
 if (sched_getaffinity(0, len, &mask) < 0) {
 perror("sched_getaffinity");
sjinks ★★★
()
Ответ на: комментарий от sjinks

Вообще-то, unsigned long - это 32 бита, а на моих обеих машинах процессоров меньше.

Во-вторых, почему же всё-таки на первой машине всё проходит c unsigned long?

Во-третьих, действительно, если использовать для маски cpu_set_t ошибка пропадает,но непонятно теперь как распечатывать маску. Если оставить оператор печати прежний

printf(«my affinity mask is: %08lx\n», mask);

то печатается

$ ./gett_affinity my affinity mask is: 00000000

что неправильно.

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

Вообще-то, unsigned long - это 32 бита, а на моих обеих машинах процессоров меньше.

И что? :-) Linux поддерживает до 256 процессоров (если я не ошибаюсь). Это 16 байт.

Во-вторых, почему же всё-таки на первой машине всё проходит c unsigned long?

Конфиг ядра другой. Ядро другое (судя по результатам uname). Или разрядность процессора другая. Или значения CONFIG_NR_CPUS различаются. Причин много.

Во-третьих, действительно, если использовать для маски cpu_set_t ошибка пропадает,но непонятно теперь как распечатывать маску.

А в чём трудности выполнить печать в цикле?

Например,

        cpu_set_t mask;
        int i;
        sched_getaffinity(0, sizeof(mask), &mask);
        for (i=0; i<CPU_SETSIZE; ++i) {
            if (CPU_ISSET(i, &mask)) {
                printf("CPU %d\n", i);
            }
        }

Ну либо unsigned char* p = &mask, цикл от 0 до sizeof(mask)-1 и printf("...", *p), ++p.

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

Нашел в чём было дело - на первой машине было CONFIG_NR_CPUS=64 (макс.кол-во процессоров), а на второй = 255.

Спасибо, разобрался ...

yserdyuk
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.