LINUX.ORG.RU

Мультипроцессорные программы на однопрцессорной системе


0

0

Собственно, subj. Как можно эмулировать многопроцессорность на однопроцессорном компе? Надо писать программы (часть - под Matlab) для многопроцессорных систем, но дома стоит обычный PIII-500MHz. Как быть, подскажите.

Спасибо за помощь!

anonymous

Простите за нескромный вопрос, но чем, собственно, с точки зрения приложения однопроцессорная система отличается от многопроцессорной?

anonymous
()

Купи процессор с HyperThreading.

anonymous
()

Есть тулкит для этого, вот только ЗАБЫЛ как называется!!! :(( MPC? MPI?

SnakePAN
()

VMWARE поставь.

anonymous
()

anonymous (*) (2003-08-05 22:02:06.740356) Это смотря какая... Слова SMP,MPP,CC-NUMA,Кластер вам что-нибудь говорят?

anonymous
()

Никак, так как в один момент времени процессор всегда будет исполнять одну инструкцию. Распараллеливание по конвейерам не в счет ;)

anonymous
()

1) посмотри OpenMP (www.openmp.org) 2) процессор с HyperPipelined технологией это не совсем SMP, так как распараллеливание там логическое. Присуще она только процессорам P-IV и не всем (это надо уточнять приобретая) Пути решения твоей проблемы все же я думаю в получении доступа хотя-бы на двухпроцессорную платформу. Где собственно и можно развернуться с OpenMP

anonymous
()

Повторяю вопрос: кому и для чего может быть нужно "эмулировать" многопроцессорность? Если не считать бессмысленного вопроса одного из предыдущих anomymous'ов, который постарался перечислить все аббревиатуры, которые он слышал по данному поводу никто, очевидно, не задумывался, что с точки зрения разработчика ПОЛЬЗОВАТЕЛЬСКОГО приложения (а не какого-нибудь драйвера) разницы между этими компьютерами нет. Если планируешь использовать его на SMP системе - пишешь обычное многопоточное приложение. Я на таких компьютерах много лет работаю. Дома у меня тоже такой стоит. race condition (с точки зрения приложения) абсолютно одинаковые. Что две нити могут одновременно на разных процессорах исполняться, что диспетчер может нити в непредсказуемый момент переключить. То же про кластеры (и про массовый параллелизм) только пишешь код, который запускает определенное число процессов, скажем по числу физических процессоров в системе (на однопроцессорной машине временно ставишь константу-заглушку) и организуешь межпроцессорное взаимодействие. (Код портируемым вообще говоря не будет, но тут же речь идет, как я понимаю только о Linux).

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

>Простите за нескромный вопрос, но чем, собственно, с точки зрения приложения однопроцессорная система отличается от многопроцессорной?

Требованием к наличию тонкой многопоточной синхронизации.

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

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

Банальный пример: планировщик может создать смещение в инструкцию, SMP может создать смещение в такт. Отсюда всплывает такая фундаментальная концепция как атомарные операции.

Murr ★★
()

Хотя не уверен делает ли BOCHS при эмуляции SMP правильную растактовку ...

Murr ★★
()

Murr, предложите, пожалуйста, ситуацию когда результат работы многопоточного ПОЛЬЗОВАТЕЛЬСКОГО приложения может быть отличаться на многопроцессорной системе.

anonymous
()

Уточнаяю: ситуация, которая может быть реализована на любом языке отличном от ассемблера. На ассемблере я и сам могу. А все системные функции использующие семафоры давно уже адаптированы к SMP.

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

>Murr, предложите, пожалуйста, ситуацию когда результат работы многопоточного ПОЛЬЗОВАТЕЛЬСКОГО приложения может быть отличаться на многопроцессорной системе.

Я же написал:

Пример кода:

int a;
...
a++;

Он будет всегда нормально работать на UP, а на SMP он без синхронизации возможно смещение частей операции a++ по конвееру, за счет чего возможен сбой при одновременном выполнении a++.

Murr ★★
()

Нет. Невозможно. Несмотря на то, что inc на x86 будет выполнять два цикла шины (операнд в памяти, потому что если операнд в регистре то и вопроса-то нет) фактическая запись будет производиться в кэш.Вероятно на старых процессорах это бы и прошло, но уже начиная с Pentium Pro разницы между inc и lock inc с точки знения ОЗУ нет. Хотя ради интереса попробую и сообщу результаты.

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

Ну, во-первых, incl будет гораздо больше трех тактов (как минимум 3 - чтение из памяти, увеличение на 1, запись в память; на самом деле тактов 10-30). Во-вторых, какая разница запись будет вестись в кэш или мимо кэша?

Это просто неатомарная операция ... процессор не блокирует шину на время её выполнения.

Murr ★★
()

вот пример программы. результаты с #define ATOMIC_INCR : proc two started(7567) proc one started(7566) proc two stopped proc one stopped a=562314785

без:

proc two started(7580) proc one started(7579) proc two stopped proc one stopped a=1000000000

-------------------------------------------------------------------- #include <stdio.h> #include <sched.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/unistd.h> #include <asm/atomic.h>

#define ATOMIC_INCR

volatile unsigned long a;

int proc(void * ids) { int i; printf("proc %s started(%d)\n", ids, getpid()); for (i=0; i<500000000; i++) #ifdef ATOMIC_INCR atomic_inc((atomic_t*)&a); #else a++; #endif printf("proc %s stopped\n", ids); return 0; }

int main() { int pid, status, res; char stack[8000];

pid = clone(proc, stack+sizeof(stack)-4, CLONE_VM|CLONE_FILES, "two"); proc("one"); res = waitpid(pid, &status, __WCLONE); printf("a=%lu\n", a); return 0; }

Z
()

вот пример программы.
результаты с #define ATOMIC_INCR :
proc two started(7567)
proc one started(7566)
proc two stopped
proc one stopped
a=562314785

без:

proc two started(7580)
proc one started(7579)
proc two stopped
proc one stopped
a=1000000000

--------------------------------------------------------------------
#include <stdio.h>
#include <sched.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/unistd.h>
#include <asm/atomic.h>

#define ATOMIC_INCR

volatile unsigned long a;

int proc(void * ids)
{
int i;
printf("proc %s started(%d)\n", ids, getpid());
for (i=0; i<500000000; i++)
#ifdef ATOMIC_INCR
atomic_inc((atomic_t*)&a);
#else
a++;
#endif
printf("proc %s stopped\n", ids);
return 0;
}

int main()
{
int pid, status, res;
char stack[8000];

pid = clone(proc, stack+sizeof(stack)-4, CLONE_VM|CLONE_FILES, "two");
proc("one");
res = waitpid(pid, &status, __WCLONE);
printf("a=%lu\n", a);
return 0;
}

Z
()

уже сам проверил. признаю свою ошибку.

anonymous
()

anonymous (*) (2003-08-06 10:37:53.60717) Як у вас все просто получается. Типа программировать UMA так же как и NUMA ???.

anonymous
()

C NUMA никогда дела не имел. Но, думаю, исходный вопрос был про SMP. А теоретически - да, я считаю, что любые smp-aware программы будут идти на компьютере с numa архитектурой. Как учит нас великий HOWTO:

It is possible, however, to connect many shared memory machines to create a "hybrid" shared memory machine. These hybrid machines "look" like a single large SMP machine to the user and are often called NUMA (non uniform memory access) machines because the global memory seen by the programmer and shared by all the CPUs can have different latencies. At some level, however, a NUMA machine must "pass messages" between local shared memory pools.

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

отличия SMP и UP

Всё просто: криво написанное многопоточное приложение (a-la приведённые примеры), может правильно работать на UP и неправильно на SMP. Вопрос: зачем придумали объекты синхронизации? Ответ: затем, чтобы таких проблем не возникало. А для особо скоростных вещей (типа счетчиков) есть всякие полезные функции типа atomic_xxx в QNX, InterlockedXXX в Win32.

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