Все наверно видели или слышали о программах тестирования розогнаных процов! Основная задача которых нагрев процессора. Вот я и задался идеей написать алгоритм нагрева: натыкал div’ов в цикл и ничего не вышло((( проц почти не нагрелся! Вопрос как эфективно его нагревать? Какие алгоритмы при этом используются?
asd да я искал нашол 2 топа: http://www.wasm.ru/forum/viewtopic.php?id=13206 http://www.wasm.ru/forum/viewtopic.php?pid=143958
AndreyATC Это не те топы, см. Какие команды нагревают CPU?. Там же кстати и объяснение, почему одними div ничего не нагреешь
leo идеи там конечно неплохие но самый теплый алгоритм греет всего до 46градусов, а вот S&M до 53 как оно достигает такого результата непонятно...
Как говорится, "отладчик в зубы и вперед" (c) Вот это я выдрал из S&M одной из первых версий когда-то давно: Code (Text): {$APPTYPE CONSOLE} {$I-,O+,Q-,R-,S-} var t1, t2 : int64; begin repeat asm dq 9090909090909090h,9090909090909090h,9090909090909090h,9090909090909090h dq 9090909090909090h,9090909090909090h;dw 9090h pushad rdtsc mov dword ptr t1,eax mov dword ptr t1[4],edx push ebp mov ebp,esp and ebp,-128 sub esp,256 fldpi fldpi fst qword ptr [ebp] fst qword ptr [ebp-8] fst qword ptr [ebp-16] mov ecx,1000000000 xor eax,eax xor ebx,ebx xor edi,edi @burn: //align 256 xor edi,ebx db $DD,$44,$2F,0//fld qword ptr [ebp+edi+0] fmul qword ptr [ebp+ebx*2-8] fmul dword ptr [ebp+edi*4-16] fxch st(1) fsubp fxch st(1) dec ecx jnz @burn fstp qword ptr [ebp] fstp qword ptr [ebp] add esp,256 pop ebp rdtsc mov dword ptr t2,eax mov dword ptr t2[4],edx popad end; write(#13'CPU usage: ', 3e11 / (t2 - t1):5:1, '%'); until false; end. Как видишь, fmul рулит
Atlantic видно таки не судьба Єтот код как и кид на форуме: Code (Text): @loop: fadd [a2] FXCH ST(2) fsub [b2] FXCH ST(2) add eax, ecx add edx, ecx add EDI, Ecx add eax, ecx add edx, ecx add EDI, Ecx dec ECX JNZ @Loop не греют больше 46 градусов, причем fmul греет хуже
Тот код, который я привел, предназначался для Athlon XP, это во-первых, а во-вторых тот цикл нужно было выровнять по границе 256 байт. Если это не поможет, тогда аттачишься отладчиком к S&M, и когда он приаттачится, один из потоков с вероятностью 99.9% будет остановлен как раз на цикле разогрева, предназначенном для твоего проца Я именно так его и выдрал.
Имхо, одной арифметикой, без активного использования памяти современные процы особо не разогреешь. У них же бОльшая часть транзисторов на кеш приходится. Вот его и надо прогревать.
AndreyATC Да, но (видимо) лучше не просто читать пару значений из L1, как это делается в вышеприведенном коде с fmul, а читать по одному дворду из кэш линейки так чтобы суммарный размер прочитанных данных был не меньше удвоенного размера L1 (но ес-но умещался в L2). Тогда при каждом чтении будет задействована пересылка целой кэш-линейки из L2 в L1.
Не думаю, что это будет эффективно - пересылка из L1 в L2 займет от 10 тактов. А тот цикл на Атлоне выполняется с макс. скоростью - 9 инструкций за 3 такта, причем задействованы и ALU, и FPU. В этом секрет его эффективности.
Есть такя прога burnP6! есть ее исходный код: Code (Text): # cpuburn-1.4: burnP6 CPU Loading Utility # Copyright 1999 Robert J. Redelmeier. All Right Reserved # Licensed under GNU General Public Licence 2.0. No warrantee. # *** USE AT YOUR OWN RISK *** .text #ifdef WINDOWS .globl _main _main: #else .globl _start _start: #endif finit pushl %ebp movl %esp, %ebp andl $-32, %ebp subl $96, %esp fldpi fldl rt fstpl -24(%ebp) fldl e fstpl -32(%ebp) movl half, %edx movl %edx, -8(%ebp) after_check: xorl %eax, %eax movl %eax, %ebx lea -1(%eax), %esi movl $539000000, %ecx # check after this count movl %ecx, -4(%ebp) .align 32, 0x90 crunch: # MAIN LOOP 21uops / 8.0 clocks fldl 8-24(%ebp,%esi,8) fmull 8-32(%ebp,%esi,8) addl half, %edx jnz . + 2 faddp fldl -24(%ebp) decl %ebx subl half+9(%esi,%esi,8), %edx jmp . + 2 fmull 8-32(%ebp,%esi,8) incl %ebx decl 8-4(%ebp,%esi,8) fsubp jnz crunch test %ebx, %ebx # Testing block mov $0, %ebx jnz int_exit cmpl half, %edx jnz int_exit fldpi fcomp %st(1) fstsw %ax sahf jz after_check # fp result = pi ? decl %ebx int_exit: # error abort decl %ebx addl $96, %esp popl %ebp movl $1, %eax # Linux syscall #ifdef WINDOWS ret #else push %ebx push %eax # *BSD syscall int $0x80 #endif .align 32,0 half: .long 0x7fffffff,0 e: .long 0xffffffff,0x3fdfffff rt: .long 0xffffffff,0x3fefffff # прога греет неплохо! но когда я перевожу этот код в МАSМ и компилю греет значительно хуже??? Прога и код прикреплены!
AndreyATC Не забывай про выравнивание кода и данных - это может сильно повлиять на эффективность прогрева.
Atlantic да но когда ровняеш код по 32-байтной границе компилятор гнет маты: error A2189: invalid combination with segment alignment : 32