Member
Статус: Не в сети Регистрация: 14.01.2004 Откуда: Киев, Украина
Цитата:
б) нет, не обязательно. Хотя вроде можно и самому (напр., даже в Task Manager есть функция Set Affinity, т.е. привязать процесс к какому-то определенному процу, ИМХО, такое же можно делать с потоками, но надо читать MSDN)
SetThreadAffinityMask - жесткая привязка к определенному процессору. SetIdealThreadProcessor - попросить ОС запустить поток на определенном процессоре, т.е. на усмотрение планировщика.
mein
Цитата:
Или по другому: нужно ли непосредственно указывать какому потоку на каком ядре работать?
Создаем поток с флагом Suspended, устанавливаем affinity mask, размараживаем потоки.
Посмотрел я на исходник Black_mirror и решил тоже на асме чего-нить накалякать. Вот функция (вставлять в мою предыдущую прогу и заменить вызов placeQueen на placeQueenAsm):
Код:
void placeQueenAsm( unsigned col, unsigned ls, unsigned ns, unsigned rs ) { int array[4*64]; __asm { push ebp lea edi, array mov ebx, ls mov edx, rs mov esi, ns mov ebp, 0 // ebp = col place: cmp ebp, N jne cont0 inc count jmp exitrecursion cont0: mov eax, ebx // row = ls&ns&rs and eax, esi and eax, edx stc rcl ebx, 1 stc rcr edx, 1 mov [edi+4], ebx mov [edi+8], esi mov [edi+12], edx and ebp, ebp jne cont1 mov ecx, N shr ecx, 1 shr eax, cl // if (!col) row >>= N/2 cont1: and eax, eax jz exitpoint // while (row) mov ecx, eax dec eax and eax, ecx // row &= row-1 xor ecx, eax // current = row_old ^ row push eax or eax, ebp jne cont2 bt N, 0 jnc cont2 shl count, 1 // if (!(col||row)&&(N&1)) count <<= 1 cont2: pop eax mov [edi], eax add edi, 16 inc ebp mov eax, ecx shl eax, 1 not eax and ebx, eax // ls & ~(current << 1) mov eax, ecx shr eax, 1 not eax and edx, eax // rs & ~(current >> 1) not ecx and esi, ecx // ns & ~current jmp place exitpoint: and ebp, ebp je exitPQ exitrecursion: sub edi, 16 mov eax, [edi] mov ebx, [edi+4] mov esi, [edi+8] mov edx, [edi+12] dec ebp jmp cont1 exitPQ: pop ebp } }
Результат (16 ферзей): 10.405 секунд против 12.048 у Black_mirror. Хе-хе. (Результат placeQueen на С++ 13.068).
exe-шник можно взять здесь.
Advanced member
Статус: Не в сети Регистрация: 09.03.2004 Откуда: Кишинёв
Билли Бонс прикольно, но хочется быстрее. Я вот свой "массивный" метод никак не могу доделать - щас времени нема. Пока он отстаёт от ваших в два раза, но надеюсь что смогу внести коррективы.
Locki Все правильно, программу Билли Бонса нужно сравнивать с программой версии 1.1, так как в версии 1.2 используется другой алгоритм. Но если там заменить BSF на (A and -A), то картина существенно меняется
Версию 1.2 без этого злополучного BSF я назвал версией 1.3 (брать здесь), теперь там можно и интервал обновления менять.
Black_mirror молодец, хорошо оптимизировал (хотя я тем не менее предпочитаю реализации на С++ - универсальней). Про другой алгоритм, ты что имеешь в виду? Рекурсию раскрыл?
Member
Статус: Не в сети Регистрация: 31.01.2004 Откуда: moskow
Билли Бонс не а... универсальна Java -)
Есть предложение, переписать на Java и тестить телефоны, смартфоны и КПК -) Добавлено спустя 2 минуты, 47 секунд Daemon
Цитата:
Locki поверь, если собрать сишный код пирата интеловским компайлером с включенной поддержкой OpenMP, то асм вариант будет в пролете.
Advanced member
Статус: Не в сети Регистрация: 30.08.2003 Откуда: Санкт-Петербург
Цитата:
Locki поверь, если собрать сишный код пирата интеловским компайлером с включенной поддержкой OpenMP, то асм вариант будет в пролете.
я тоже верю в интеловский компилер! Увы, человек не может запомнить все тонкости оптимизации под какой-то определенный процессор, т.е. будет генерить не самый оптимальный код. А компилер - программа, т.е. в него можно заложить все известные правила оптимизации под все процы...
_________________ {:€ дед в законе :-) нородный окодемег почетный пользователь OpenSuSE 11.3 Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения