ThinkPad T480sにスマートカードリーダー追加

マイナンバーカードを入手したのでThinkPad T480sに内蔵スマートカードリーダーを追加しました。

必要なもの:

ThinkPad スマートカードリーダー P/N 04X5393
・T480s用 スマートカードリーダー/指紋センサー FPCケーブル P/N SC10G75221
・小さいドライバー(No.0)とピンセット

あった方がいいもの:

・ハードウェア保守マニュアル - ThinkPad T480s (Lenovoサイトから無償ダウンロード)

スマートカードリーダーの入手:

以前Wi-Fi 6に換装した時はAmazonで購入しましたが、今回はAliExpress(中国Alibaba)を利用しました。AliExpressで[04X5393 T480s]で検索して、スマートカードリーダーとFPCケーブルのセットを選択します。FPCケーブルも必須なので注意してください。約2,000円で購入できました。支払いはクレジットカード番号が相手に渡らないPayPalを利用しました。

f:id:tsuru3:20210501170736j:plain

今回購入したスマートカードリーダーとFPCケーブル
郵便局の荷物追跡:

中国から小物を買う場合、国際eパケットライト(トラッキングナンバーはLP012345678CNのような形式)で発送される事が多いようです。配達は郵便局が行っています。ゆうパケットと同じく郵便受け投げ込みですが、中国での輸送状況も含め郵便局サイトで荷物追跡ができ、日本到着後からは配達完了通知メールの設定ができます。

f:id:tsuru3:20210501165830p:plain

郵便局の荷物追跡
スマートカードリーダー取付手順:

・裏蓋の黒色ネジ6本を緩めてヒンジ側を少し持ち上げてからヒンジ側へ引き裏蓋を外す

・内蔵バッテリーの銀色ネジ4本を外し、内蔵バッテリーのコネクター側を持ち上げてバッテリーを外す

・右スピーカーの黒色ネジ2本を外し、右スピーカーを外す

・右スピーカーの下にあるダミースマートカードリーダーの黒色ネジ2本を外し、ダミースマートカードリーダーを外す

・指紋センサーのFPCケーブルを外す:指紋センサーとメインボードのFPCコネクターは黒色樹脂部分のFPCケーブル側を上に持ち上げるとロックが外れる

f:id:tsuru3:20210501171443j:plain

指紋センサーのFPCコネクター(アンロック状態)

スマートカードリーダーに今回購入したFPCケーブルを接続する:スマートカードリーダーのFPCコネクターは灰色樹脂部分を横に引っ張るとロックが外れるので、その状態でFPCケーブルを奥まで挿入し、灰色樹脂部分を元に戻してロックする

f:id:tsuru3:20210501172456j:plain

スマートカードリーダーのFPCコネクター(アンロック状態)

スマートカードリーダーを黒色ネジ2本で取り付ける:下図左下のブラケットは筐体のスリットに挿入されるので注意

f:id:tsuru3:20210501173117j:plain

スマートカードリーダーの取付状態:左下ブラケットに注意

・メインボードと指紋センサーのFPCコネクターにFPCケーブルを奥まで挿入し、FPCコネクターの黒色樹脂部分を下に降ろしてロックする

・右スピーカー、内蔵バッテリー、裏蓋を取り付ける

Windows設定:

スマートカードリーダーの取付に問題がなければ、Windowsのデバイスマネージャーに以下のように表示されます(内蔵ですがUSB接続らしい)

f:id:tsuru3:20210501173710p:plain

ドライバー未インストール時

手動でドライバーを追加してもいいのですが、面倒なのでLenovo Vantageを起動して[システム更新を確認]ボタンをクリックします。以下のようにスマートカードリーダーを自動検出してくれるので推奨ドライバーをインストールします

f:id:tsuru3:20210501174059p:plain

Lenovo Vantage

インストール後はデバイスマネージャーにAlcor Micro USB Smart Card Readerが表示されます

f:id:tsuru3:20210501174257p:plain

ドライバーインストール完了

これで完了です。使う時はスマートカードの金色端子面を上側にして奥までしっかり挿入します。

本体から少しカードがはみ出るので、カード入れっぱなしでの持ち運びには難ありですが、2,000円位なら付けておいても良いかと。

f:id:tsuru3:20210501174522j:plain

スマートカードリーダー使用状態

※内蔵スマートカードリーダーを追加した理由:3月に確定申告する時にUSB外付けスマートカードリーダーが見あたらず、探すのに半日かかったため

 

N-VANの純正ETC取付位置にETC装着(とても簡単)

N-VANの純正ETC取付場所に市販のステー等を使わずにETCを取付けます

  1. インパネの純正ETC取付位置(ステアリングコラムの下)にインパネ裏側からプラスチックカッター、カッターナイフ等を使い穴を開ける
  2. ダイソー等で6mm厚の板材かMDF材を買ってきて、70mm幅x65mm長に切っておく:桐材やMDF材なら大きいカッターナイフでも頑張れば切れる
  3. ETCの下側、パネル前面から15mm位後ろに下げた位置に両面テープ+布テープ等で切った板材を貼付ける
  4. 純正ETC取付位置に板材がインパネ前面に当たる所までETCを差し込む

    f:id:tsuru3:20200721213449j:plain

    木材は黒マジックで塗装しています
  5. インパネ下側から6mm位の短い木ネジ2本で固定する

f:id:tsuru3:20200721213459j:plain

短い木ネジ2本で固定

完了! 材料費<200円、作業時間30分

ThinkPad T480s で Wi-Fi 6

ThinkPad T480sの内蔵Wi-Fiモジュールを標準のAC8265(Wi-Fi 5)からAX200(Wi-Fi 6)に換装しました。

 

必要なもの:

Intel AX200 (Wi-Fi 6 / M.2 2230)

・AX200用Wi-Fiドライバー、Bluetoothドライバー (Intelサイトからダウンロード)

Wi-Fi 6 ルーター (NEC WX6000HPなど)

 ・小さいドライバー(No.0)とピンセット

 

 あった方がいいもの:

・2.5Gb Ethernetインターフェース(AREA Mr.Jackなど:デスクトップPC用)

・ハードウェア保守マニュアル - ThinkPad T480s (Lenovoサイトから無償ダウンロード)

 

換装手順:

  1. インテルのサイトからAX200のWi-FIBluetoothのドライバーをダウンロードしてT480sの内蔵SSDに保存しておく("AX200 driver"で検索)
  2. [設定]→[システム]→[電源とスリープ]→[電源の追加設定]→[電源ボタンの動作を選択する]→[現在利用可能ではない設定を変更します]→[高速スタートアップを有効にする] のチェックボックスをクリア
  3. 再起動してLenovoロゴが出たら[F1]キーを連打してBIOS Setup画面に入る
  4. [CONFIG]→[POWER]→[Disable built in battery]を選択してEnter→[Yes]を選択すると電源が切れるので、ACアダプターを外してPCが冷えるまで3~5分待つ
  5. 裏蓋のネジ6本を緩めてヒンジ側を少し持ち上げてからヒンジ側へ引き裏蓋を外す
  6. AC8265のアンテナケーブル2本をコネクター部にピンセット等を引っ掛けて慎重に外し、次に固定ネジを外す
  7. AC8265を外しAX200を装着して、固定ネジを付けて慎重にアンテナケーブルを付ける
  8. 裏蓋を閉めてT480sを起動する
  9. Windows10ではAX200を自動認識しないようなので、1. でダウンロードしておいたAX200用ドライバー(Wi-Fi/Bluetooth)をインストールする

 

結果:

@5.3GバイトのファイルをT480s→Desktop PCにコピー

 77秒 @T480s:AC8265(866Mbps)→WX6000HP→Desktop(GbE) ≒ 550Mbps

 45秒 @T480s:AX200(2.4Gbps)→WX6000HP→Desktop(GbE) ≒ 940Mbps

 30秒 @T480s:AX200(2.4Gbps)→WX6000HP→Desktop(2.5GbE) ≒ 1.4Gbps

 

 Wi-Fi 5(802.11ac)と比べてWi-Fiルーター⇔Desktop PCの接続がGbEの時は1.7倍速、2.5GbEでは2.5倍速なので100MB以上の大きなファイル転送では結構速度差を感じます。内蔵有線GbEよりも速くなったのでT480sではもう有線は使わない。ただWi-Fi 5でも十分速いので一般人には無用かも。またAC8265からAX200に換装するとWPA3が使えますが、こっちも訴求力はいまいちですね。

なおWX6000HPのファームウェアは初版(1.02)が入っていたのですが、GbE接続時の転送速度が200Mbps以下になってしまい、1.20に更新したら治りました。電源入れたら最初に更新しておくことをお勧めします。

 

N-VAN 自作アイドリングストップキャンセラー

HONDA N-VANのECONスイッチまわりを調べてみました。

 ネットで多数報告されているN-BOX(JF3/JF4)と同様、ECONスイッチを押すと緑色配線と黒色配線(グラウンド)がショートします。エンジン起動後Accの電圧が14.3Vの時に、スイッチオープン状態で緑色:13.3V、緑色と黒色を1Ω抵抗でショートすると緑色:6.8mV(=電流値6.8mA)でした。13.3V ÷ 6.8mA = 1.96KΩなので、IGからダイオード?等が1段噛んでから緑色配線を2KΩでプルアップしているようです。

 この緑色配線をエンジン起動後しばらくの間グラウンドに落とせばECONキャンセル回路(≒アイドリングストップキャンセラー)になります。とても古典的な電源監視IC(リセットIC) MB3771で5秒間のリセット回路を作ってみました。MB3771の通常出力(pin8)はオープンコレクターではないので、ダイアグ等でエラーにならないよう、おまじないとしてトランジスターを追加しオープンコレクター出力にしています。C2も同じくおまじないの電源ノイズ対策で、無くても多分大丈夫です。

 MB3771はディスコンで入手が難しいですが、代替品としてNJM2103/NJU2103が使えます。オープンコレクター出力のM51957Bが使えるともっと簡単なのですが、今回は出力電流(6.8mA)が絶対最大定格(6mA)を超えてしまうのでNGです。ノイズ対策のためだと思いますが、今どきの電子回路としては大電流ですね。

f:id:tsuru3:20190907182028p:plain

N-VAN ECONキャンセル回路

 

PICでUSB電圧・電流モニター

USBの電圧・電流モニターは1000円以下で買えますが、PICで自作してみました。

通常はLDOレギュレーターで5Vから3.3Vを作りPICを動作させるのですが、余っていたPIC16F88を使用したため4V以下では動作保証されません。このため可変電圧LDOレギュレーターで4Vを作っています。今回はLEDを点灯させているので、3.3Vよりは4Vの方が使いやすいです。
ZXCT1021はハイサイド電流検出専用ICで、電流センス抵抗両端電圧差の10倍の電圧が出力され(0〜1.5V)また電源電圧の絶対最大定格は20Vです。今回は20mΩの電流検出抵抗器を使ったため、これらの制約により測定範囲は4.5〜20V、0〜7.5Aとなり、USB Quick Charge2.0/3.0のClass A(最大12V)が測定可能です。USB以外のコネクターを使えば他のDC電圧・電流簡易測定にも使えると思います。表示更新周期が1秒なので、A/D入力にはノイズ取り用に大きな抵抗とコンデンサーを入れています。

やっている事が電圧を2つADコンバーターで取り込んでLEDに出力しているだけで、あまり面白くないためフォトカプラーを追加して絶縁型シリアルデーター出力を追加しました。フォーマットは9600/8/1/Nで、 000:00:10,08.93,0.413 この形式で時分秒、電圧、電流がコンマ区切りで出力されます。この出力はシリアル⇔USB変換LSI Prolific PL-2303HXに接続してUSB経由でPCへ接続しているため正論理の出力にしていますが、フォトカプラーの出力で反転させれば直接PCのRS-232Cへ接続しても短いケーブル長なら読み取れると思います。この回路の消費電力は実測15mA、LEDを消灯した場合は4mAでした。アナログ入力ポートがまだ余っているので、モバイルバッテリーを接続して絶縁型簡易電圧測定にも使えるかもしれません。

フォアグラウンドプログラム main() はI/Oや変数の初期化を行った後Timer1割り込みを許可し、グローバル変数に値がセットされるまで待ち続けます。
2.36msごとのTimer1割り込みでバックグラウンドの割り込み処理プログラムが走り、まず6個の7セグメントLEDのうち1つに順番にデーターを表示させます。次にシリアルポート出力が未完了の場合は出力します。その後電圧・電流をローカル変数に加算します。電圧・電流サンプリングが#define SAMPLINGで規定された回数になったら電圧・電流の加算値をグローバル変数に格納してローカル変数をクリアします。
フォアグラウンドプログラムは、グローバル変数に値がセットされたら表示桁を合わせてからBCD変換してLED表示バッファーに格納し、シリアルポート出力文字列をセットし、処理終了後にグローバル変数をクリアして再度セットされるまで待ちます。これを1秒周期で繰り返す事になります。

調整点は2つで、まず抵抗値のばらつきにより測定値に若干の誤差が出るため、テスターで測定したUSB電源電圧とLED表示が「ほぼ」合うように#define SAMPLINGの値を増減させます。この回路で抵抗の誤差が全く無い場合はVDD=4.064Vで電圧の分圧比が10/101=0.099なので4.064÷0.099✕10(表示する小数点の位置を調整)でSAMPLING=410が理論値になるのですが、今回の製作例では424になりました。次にこのサンプリング数の取り込みが終了し、出力処理が終了した時にちょうど1秒経過するようにタイマーT1の周期を#define TMR1H_VAL/TMR1L_VALの値で設定します。今回はSAMPLINGが424回+結果の出力1回なので割り込み周期は1÷(424+1)=2.353msになります。これで1秒おきに電圧・電流値がシリアルポートへ出力されます。

#include 
#include 
#include 

//__CONFIG( UNPROTECT & BOREN & OSC_8MHZ & MCLRDIS & PWRTEN & WDTDIS & INTIO );
#pragma config FCMEN=OFF
#pragma	config IESO=OFF
#pragma	config CPD=OFF
#pragma	config CP=OFF
#pragma	config BOREN=OFF
#pragma	config MCLRE=OFF
#pragma	config PWRTE=OFF
#pragma config LVP=OFF  //
#pragma config WDTE=OFF
#pragma config FOSC=INTOSCIO

#define _XTAL_FREQ 8000000
#define TMR1H_VAL 0xf6      // 65536-2353=0xf6cf
#define TMR1L_VAL 0xcf      // 2353 * 1us = 2.353ms period
#define ADC_V 2             // Vsense ADC ch.
#define ADC_C 3             // Csense ADC ch.
#define SAMPLING 424;       // no. of sampling

unsigned char h, m, s;
unsigned char disp[6];      // display line buffer
unsigned char ser_out[] = "\n\r000.0,00.00,00:00:000\0";  // serial out buffer, reverse order
unsigned char ser_ctr;
unsigned int r_voltage;
unsigned int r_current;

void init(void)
{
    OSCCON = 0x70;      // INTOSC 8MHz
    ANSEL = 0x0c;       // RA3:Current(20A@full scale), RA2:Voltage(40V@full scale)
    TRISA = 0x6d;       // RA7:LED_data bit2 RA4:dot pos @Voltage 1:left dig. 0:mid dig. RA1:debug
    TRISB = 0x00;       // RB7,6,4:LED_select bit2,1,0 RB3,1,0:LED_data RB5:TX
    PORTA = 0x00;
    PORTB = 0x00;
    OPTION_REG = 0xff;  // PORT B weak pull up disable

                            // adc setup
    ADCON0 = 0b00100001;    // clock=fosc/16, a/d enable
    ADCON1 = 0b01000000;    // left justified, Vdd/Vss ref

                            // timer1 setup
    T1CON = 0b00010100;     // T1CKPS:1/2 T1OSCEN:F *T1SYNC:F TMR1CS:INT TMR1ON:F
                            // timer1 clock freq. is 8MHz/4/2=1MHz
    PEIE = 1;               // all peripheral interrupts are enabled
    GIE = 1;                // global interrupt enabled
    TMR1H = TMR1H_VAL;      // set timer1 interrupt period
    TMR1L = TMR1L_VAL;
    TMR1IE = 1;             // timer1 interrupt enable
    
                            //serial port setup
    TXSTA = 0b00100000;     // tx9:0, txen:1, sync:0, brgh:0
    RCSTA = 0b10000000;     // spen:1, rx9:0, cren:0
    SPBRG = 12;              // 9600bps

    h = m = s = 0;
    ser_ctr = 0;
    r_voltage = 0;
    r_current = 0;
    TMR1ON = 1;             // timer1 start
 
}

// read adc
unsigned int adc_read( unsigned char ch )
{
    unsigned int value;	// adc value
    unsigned char i;
    
    RA1 = 1;
    ADCON0 = (ADCON0&0xc7)|(ch<<3);
    __delay_us(16);         // Tacq
    
    for(i=0, value=0; i<32; i++){
        GO_nDONE = 1;       // ADC start
        while( GO_nDONE )
            continue;
        value += ADRESH;
    }
    RA1 = 0;
    return value>>5;
}


interrupt void timer1_overflow(void)
{
    static unsigned int voltage = 0;
    static unsigned int current = 0;
    static unsigned char disp_ctr = 0;
    static unsigned int meas_ctr = SAMPLING;      // mesurement counter

    TMR1ON = 0;         // stop timer1
    TMR1IF = 0;         // clear timer1 interrupt flag
    TMR1H = TMR1H_VAL;  // reset timer1
    TMR1L = TMR1L_VAL;
    TMR1ON = 1;         // start timer1

    PORTB = disp[disp_ctr];             // LED display
    RA7 = (disp[disp_ctr++]&0x04)?1:0;
    if(disp_ctr == 6)
        disp_ctr = 0;

    if(ser_ctr){        // serial port output
        ser_ctr--;
        TXREG = ser_out[ser_ctr];
    }
    
    if(meas_ctr){
        if(meas_ctr&0x01){
            voltage += adc_read(ADC_V);
        }else{
            current += adc_read(ADC_C);
        }
        meas_ctr--;
    }else{          // measurement complete, copy data
        if(s!=59){  // timestamp
            s++;
        }else{
            s = 0;
            if(m!=59){
                m++;
            }else{
                m=0;
                h++;
            }
        }
        r_voltage = voltage;
        r_current = current;
        voltage = 0;
        current = 0;
        meas_ctr = SAMPLING;
    }
    return;
}

void bin2bcd(unsigned int val, unsigned char *b){
    union{
        unsigned long int bd32;
        struct{
            unsigned bd8l : 8;
            unsigned bd8h : 8;
            unsigned bcd0 : 4;
            unsigned bcd1 : 4;
            unsigned bcd2 : 4;
            unsigned bcd3 : 4;
        }bcd;
    }work;
    char i;

    work.bd32 = (unsigned long int)val;
    for(i = 0; i < 16; i++){
        if(work.bcd.bcd0 >= 5)
            work.bcd.bcd0 += 3;
        if(work.bcd.bcd1 >= 5)
            work.bcd.bcd1 += 3;
        if(work.bcd.bcd2 >= 5)
            work.bcd.bcd2 += 3;
        if(work.bcd.bcd3 >= 5)
            work.bcd.bcd3 += 3;
        work.bd32 <<= 1;
    }
    b[0] = work.bcd.bcd0;
    b[1] = work.bcd.bcd1;
    b[2] = work.bcd.bcd2;
    b[3] = work.bcd.bcd3;
    return;
}

int main(int argc, char** argv) {
    
    unsigned char bcd[4];
    
    init();
    
    while(1){
        while(!r_voltage){
            // wait until measurement complete
        }

        bin2bcd(s, bcd);              // second
        ser_out[14] = bcd[0] + '0';
        ser_out[15] = bcd[1] + '0';
        bin2bcd(m, bcd);              // minutes
        ser_out[17] = bcd[0] + '0';
        ser_out[18] = bcd[1] + '0';
        bin2bcd(h, bcd);              // hour
        ser_out[20] = bcd[0] + '0';
        ser_out[21] = bcd[1] + '0';
        ser_out[22] = bcd[2] + '0';
        
        // calculate Current, r_current / 128 * 100
         bin2bcd((r_current>>2)+(r_current>>3)+(r_current>>6), bcd);
        ser_out[2] = bcd[0] + '0';
        ser_out[3] = bcd[1] + '0';
        ser_out[4] = bcd[2] + '0';
        ser_out[6] = bcd[3] + '0';
        disp[0] = bcd[1];
        disp[1] = 0x10 | bcd[2];
        disp[2] = 0x40 | bcd[3];
        
        // caluculate Voltage, r_voltage / 128 * 10
        bin2bcd((r_voltage>>4)+(r_voltage>>6), bcd);
        ser_out[8] = bcd[0] + '0';
        ser_out[9] = bcd[1] + '0';
        ser_out[11] = bcd[2] + '0';
        ser_out[12] = bcd[3] + '0';
        if(bcd[3]){
            RA4 = 0;    // Mid LED dot on
            disp[3] = 0x80 | bcd[1];
            disp[4] = 0x90 | bcd[2];
            disp[5] = 0xc0 | bcd[3];
        }else{
            RA4 = 1;    // left LED dot on
            disp[3] = 0x80 | bcd[0];
            disp[4] = 0x90 | bcd[1];
            disp[5] = 0xc0 | bcd[2];
        }
        
        ser_ctr = 23;
        r_current = r_voltage = 0;
    }


    return (EXIT_SUCCESS);
}

BCD変換は以下のサイトのプログラムを参考にさせて頂きました。
プログラミングな日々: PICマイコンでBCD変換

また私はProlific PL-2303HXというチップを使ったシリアル→USB変換アダプターを使っているのですが、Windows10ではドライバーが提供されていないため以下のサイト経由でパッチ当てドライバーを入手してインストールしています。
Windows10でPL2303を無理やり動かす | なんでも独り言

※7セグメントLEDを6個並べると配線工数のほとんどがLEDですね。次はI2C接続の液晶使おうと思います。

Core i7-5820KでLTspice

Intel Core i7-5820Kが中古で出ていたので購入しました。5820Kは品番は5000番台ですが、中身はIntelの第4世代Core CPU(4000番台:Haswell)を拡張したハイエンドPC向けCPUで、3.3GHz/6コア/12スレッドとなっています。CPUソケットはLGA2011-v3でサーバー用CPUのXeonと同じ。

LTspiceベンチマークしてみました。Core i3-3220が3.3GHz/2コア/4スレッドですから、これが3個入っていると考えるとLTSPICEもi3-3220より3倍速い事を期待したくなります(それも目的で買った)。

  1. 回路サンプルとして添付されている LTspiceIV\examples\Educational\NE555.asc を開く
  2. シミュレーション時間を .tran 1000m として30msから1秒に変更する
  3. シミュレーションを実行し、Ctrl-Lを押してTotal elapsed timeを見る


Core i7-5820KはLTspice Version 4.23k(Mar.2016)
Athlon,A10,PhenomIIはLTspice Version 4.21z(Oct.2014)
※E-350/i3-3220はLTspice version 4.20m(Mar.2014)

・・・全然速くないですね(笑)。i3-3220のせめて2倍を期待したのですが、1.4倍止まり。

なぜ遅いか調べたところ、LTSPICE実行中のCPU使用率が30%位までしか上がっていませんでした。そこでLTSPICE Control PanelのSPICEタブでMax threadsを1〜12まで変化させてシミュレーションの実行速度を比較してみました。

5820Kは6コア+HT(ハイパースレッディング)で12スレッドも使えるのに、下図のとおり3スレッドで速度が頭打ちになっており、「3つで十分ですよ」状態。

次の図は1〜5スレッドで実行中のCPU負荷率ですが、最初の山が1スレッド、次が2スレッドで3〜5スレッドはほぼ同じ負荷率で止まっています。

これは回路規模が小さく処理が軽すぎるのかもしれません。そこでNE555.ascの元の回路からLabelを消去した後に同じ回路を図面上に3つコピーして(合計同じ回路が4つ)負荷を4倍にしてみました。同じようにスレッド数を変化させると処理速度とCPU負荷率は下図のようになりました。処理速度は上と合わせるため4倍換算しています。シミュレーション速度はやはり5〜6スレッド程度で頭打ちになっており、その上10スレッド以上はかえって速度が落ち気味のように見えます。


CPU負荷率の図は4〜9スレッドで実行時のものです。こちらはCPU負荷率は順調に上がっており12スレッド時は98%まで上がるのですが、6スレッド以上は速度は上がらないのに消費電力だけは増えていく、まさに無駄飯食らい状態(笑)。消費電力測定時はHDDを外してSSDだけ接続しています。


考察:
5820Kは6コア+HTで12スレッドまで可能ですが、Intel公式発表ではHTによる性能向上は15〜30%との事でした。よって6スレッドまでは使用コア数が増えるのでスレッド数の整数倍にCPU性能は向上しますが、7スレッド以降はHTによる(仮想?)マルチコアのためスレッドあたり最大でも0.3コア程度の性能向上となります。
これがスレッド追加のオーバーヘッドによる性能低下を上回れば処理速度は上がりますし、下回ればスレッドを増やしても処理速度はかえって下がります。実際、1スレッドから2スレッドに変更しても1.5倍程度しか処理速度が上がっていない事からも、かなりオーバーヘッドが大きい事が分かります。とは言っても無料ソフトでこれ以上望むのも酷かと思います。

結論:

  • LTSPICEは多コア/多スレッドCPUでもあまり速度が向上せず、HTの効果も薄いので、HT対応CPUの場合は実コア数=最大スレッド数(Max threads)に設定した方が地球温暖化防止の面からも幸せになれるかもしれない
  • LTSPICEでは2.2GHz/22コア/44スレッドのXeon E5-2699v4(メーカー希望小売価格 $4115)より、3.5GHz/4コア/4スレッドのCore i5-6600K(メーカー希望小売価格 $243)の方が速いかもしれない

今回の機器構成は以下の通りです。

  • Intel Core i7-5820K (3.3GHz/6Cores/12Threads)
  • AsRock X99 Extreme 4 (LGA2011-v3, ATX)
  • Crucial DDR4-2133 8GB (Single rank) x4 (Quad Channel)
  • GeForce GTX 750ti 2GB
  • Intel SSD730 240GB
  • WDC WD60EFRX x 多数 → Windows記憶域プール
  • Seasonic SS-560KM (560W 80Plus Gold)
  • Windows10 Professional

Full HD動画のH264エンコード速度を測定するx264 FHD Benchmark1.01の結果は32fpsで、PC WatchのレビューではCore i7-4790K(4.0GHz/4コア/8スレッド)が28fps、Core i7-6700K(4.0GHz/4コア/8スレッド)が30fpsでしたからそれらより少し速いようです。
Core i7-5820Kは公称TDP140Wですが、クロックが低いのでCore i7-4790S(3.2GHz/4コア/8スレッド:TDP65Wの低消費電力版)のCPUコアが1.5個分で内蔵GPUが無しと考えると実質TDP100W以下かな?SSDのみ接続してHDDを外した状態での消費電力実測値はWindowsアイドル:48W、x264 FHD Benchmark1.01実行中:143Wでした。アイドル時とエンコード時の差分は95W。PC WatchCore i7-4790KレビューではWindowsアイドル:60W、x264 FHD Benchmark1.01実行中:161W、差分は101Wですので、消費電力あたりのエンコード速度では4790Kを上回っているようです。

LTSPICEではいまいちでしたが、動画編集用には良い環境になりました。今まで使っていたPhenomII X6 1065Tを買ったのが5年前なので、これであと5年は戦える?でも3〜4年後位にi7-6950Xが中古で安く出回ったら、更なる延命のために載せ替えを検討しよう。

Athlon 5350でLTspice

前回A10-7850KでLTspice - tsuru3の日記AMD E-350とA10-7850KをLTspiceで比較しましたが、今回E-350後継のAthlon 5350が中古で出ていたので購入しました。

Athlon 5350は、ノートPCに使われているAMD A6-5200(Kabini)をほぼそのままソケット実装にしたものです。E-350の消費電力(TDP)は18W、Athlon 5350は25Wですが、E-350では外付けだったA50M FCH(消費電力5.9W:List of AMD chipsets - Wikipedia参照)がAthlon 5350ではCPUに内蔵されているので、合計するとほぼ同じ消費電力です。AMD広報資料ではE-350比2〜4倍の性能でIntel Pentium J2900と同等とのことですが、単純計算でも[E-350] : 1.6GHz/2Core ⇒ [Athlon 5350] : 2.05GHz/4Coreなので(2.05*4)/(1.6*2)=2.6倍速いことになります。

前回と同じくLTspiceで簡単にベンチマークしてみました。

  1. 回路サンプルとして添付されている LTspiceIV\examples\Educational\NE555.asc を開く
  2. シミュレーション時間を .tran 1000m として30msから1秒に変更する
  3. シミュレーションを実行し、Ctrl-Lを押してTotal elapsed timeを見る

時間 速度 CPU
196秒 1.0 E-350 (1.6GHz/2Core)
076秒 2.6 Athlon 5350 (2.05GHz/4Core)
059秒 3.3 A10-7850K (3.7GHz/4Core)
049秒 4.0 PhenomII X6 1065T (2.9GHz/6Core)
039秒 5.0 Core i3-3220 (3.3GHz/2Core+HT)


LTspice Version 4.21z(Oct.2014)
※E-350/i3-3220はLTspice version 4.20m(Mar.2014)

Athlon 5350は思ったよりもLTspiceとの相性が良く、E-350から単純計算通りの性能アップになっています。消費電力を増やして3割クロックアップしたAthlon 5XXX 2.7GHz/4Coreが出ればLTspiceではA10-7850Kと同程度の性能になるかも、というかA10-7850KとLTspiceの相性が悪すぎるような。

今回の機器構成は以下の通りです。

  • AMD Athlon 5350 (2.05GHz/4Core)
  • Gigabyte GA-AM1M-S2H (Socket AM1, MicroATX)
  • Samsung DDR3-1600 4GB x1 (Single Channelなので2枚挿しても速くならない)
  • WDC WD30EZRX (3TB HDD, 1TBプラッター×3枚、Intellipower)
  • Mini-Box picoPSU-120 (120W ACアダプター電源)
  • Windows7 Home Premium

picoPSU-120の+12V入力端子での消費電流は以下の通り(HDD/冷却Fan含む)。12V/4AのACアダプターで使えそうです。

2.8A (34W) … 起動時最大値
1.1A (13W) … Windows7起動後5分経過(HDDは回転中)
2.1A (25W) … LTspiceで上記ベンチマーク実行中
2.6A (31W) … FFXIVベンチマーク実行中(1280x720標準品質デスクトップPC)
2.5A (30W) … x264動画エンコード

私のA10-7850Kパソコンでのx264動画エンコード速度は実測でAthlon 5350の2.5倍、その時の消費電力は5倍の150Wだったので、Athlon 5350は消費電力あたりのエンコード能力ではA10-7850Kの2倍になります。Playstation 4XBox OneのCPUにはAthlon 5350と同じCPU Coreが8個載っていますので、Socket AM1で8Coreバージョンが発売されると面白いかも。

今回のシステムは「録画サーバー用」に組みましたが、普通のパソコンとして使ってもLTspiceでも「もっさり」した感じがなく、比較的高いグラフィック性能やHDMI接続での8ch LPCM出力機能など、普通に使うには十分な性能だと思います。