|    | 
     ▼tsukasamさん: 
>その後のさらなる改造で多段のVID変更要求でも自身で1段ずつ変更できるようになりました。ただし20ms/段の時間を必要とします。20ms/段ってのは長すぎだろーって自分でも思ってますが、確実に動作させたかったのでとりあえず。 
>それで、3.3.7.152の LoveHammer()の case 7:の倍率上げ時の P->SysInfo->SetData(LH_SET_FID, FID); の直前に、if(flag){Sleep((vid-VID)*20);} をつっこみました。 
先ほどはなるほどと思ったのですが、電圧の変更は CpuInfo.cpp の SetData で呼び出した先で行っており、SetData を呼び出す直前にスリープしても特に意味はありません。詳細は CpuInfo.cpp ですが、一部を抜粋すると 
 
{ 
if( data == 15 || data == 31 ){ 
    break; 
} 
DWORD count = 32; 
while( count-- ){ 
    DWORD CurrentVID = 0; 
    DWORD NextVID = 0; 
 
    ReadMSR(0xC0010042,&EAX,&EDX); 
    CurrentVID = EDX & 0x1F; 
    if(data > CurrentVID){ 
        NextVID = CurrentVID + 1; 
        if( NextVID == 15 ){ 
            NextVID++; 
        } 
    }else if(data < CurrentVID){ 
        NextVID = CurrentVID - 1; 
        if( NextVID == 15 ){ 
            NextVID--; 
        } 
    }else{ 
        break; 
    } 
 
    if( NextVID == 31 || NextVID < 0 || NextVID > 31 ){ 
        break; 
    } 
 
    ReadMSR(0xC0010041,&EAX,&EDX); 
    EAX &= 0xFFFFE0FF; 
    EAX |= 0x00020000; // Set bit 17  (VID) 
    EAX &= 0xFFFEFFFF; // Clear bit 16 (FID) 
    EDX = 0x64;    // Allow minimum 100 ms settling time 
    EAX |= ( NextVID << 8 ); 
    WriteMSR(0xC0010041,&EAX,&EDX); 
    do{ 
        ReadMSR(0xC0010042,&EAX,&EDX); 
    }while( (EAX >> 31) & 0x1 ); 
} 
 
} 
 
って感じです。一段階の電圧を変化させる度に、 
do{ 
    ReadMSR(0xC0010042,&EAX,&EDX); 
}while( (EAX >> 31) & 0x1 ); 
で電圧が安定するのを待っています。(詳細は BIOS & Kernel Developer's Manual 参照)  
 
多段階電圧変更を一段ずつ行うようになったのは SysInfo.dll 148 からなので、それ以前のバージョンに比べると一部の環境で安定度が増したと思われます。 
 | 
     
    
   |