FPGA、GPGPU、CPUの違いは消費電力対性能比

今どきCPUだけで大丈夫?

GPGPUとCPUの違いを並列性の有無とか高速性で説明するとミスリードするよね。

CPUだって並列化が進んでる。ハイエンドのCorei7だとSIMDで1コア辺り8個の倍精度演算を同時におこなう。それが6コアあるので48並列で演算できる事になり、理論性能は倍精度で160GFLOPS近い。

GPGPUはというと、例えば GeForce GTX 980の場合、2048コアで単精度なら4.6TFLOPSを超える。単精度ならってのがGPUに特化したチップの弱点で、倍精度だと144GFLOPSまで落ち込む。

Core i7 5820K BOXが4万円台、GeForce GTX 980搭載ビデオボードが5万円台。科学技術計算で多く使われる倍精度演算に用途を限ると、価格性能比ではよい勝負となる。GPGPUのほうが並列数が多い上に、バス速度がボトルネックになりやすく、最適化も難しい。下手をすると価格性能比でGPGPUよりもCPUの方が勝るということになる。

数値演算に特化したNVIDIA TESLA K20だと倍精度でも十分な演算速度が得られており、約1.2TFLOPSで約50万円。同性能のCPUというとXeon HaswellのデュアルCPU構成にすると1.3TFLOPSで約110万円。やっぱりGPGPUの方が価格性能比が・・・と思うかもしれないが、拡張スロットに刺してよいなら Xeon Phiという選択肢もある。Xeon Phiなら1TFLOPSで約20万円くらいで手に入る。やっぱり価格性能比ならCPUの方が安いってことになる。

こうなるとGPGPUのメリットは何?って感じになるが、消費電力対性能比だとGPGUの方が勝っている。TESLA K20の消費電力は225W程度だが、Xeon Phiは300Wも消費する。

本質的には汎用性の有無と消費電力で説明した方が良い。汎用性が高い代わりに消費電力の大きなCPUと、汎用性が低い代わりに消費電力の小さいGPGPU。ちなみにFPGAの性能を単純にFLOPSで表現するのは難しいけど、 Virtex UltraScaleは最大で1.7TFLOPSにたいして、消費電力は最大で100Wに届かないので、消費電力対性能比はGPGPUよりさらに勝ることになる。

もちろんCPUに加えてGPUも使える環境なら、GPGPUを使って演算をオフロードしたほうが早くなるし良い。既存のPCに後付けでGPGPUを追加する選択もありだろう。たが演算を高速にするために専用にサーバーを用立てるなら、最初からGPGPUを選択すべきかは微妙なところだよね。

開発体制を保持する(Cloud向け開発の覚書き )

クラウド向けにシステムを構築した場合、必ず自社内に開発できる体制を保持しておく。IaaSはともかく、PaaSやSaaSは仕様変更やサービス終了と無縁では居られない。仕様変更やサービス終了が告知された場合は、システムを維持するために速やかに改修する必要がある。この時に開発体制を外部に依存しているとシステムの維持に大きなリスクを負うことになる。

クラウド外にバックアップする(Cloud向け開発の覚書き )

クラウドの外にデータをバックアップする方法を検討しておく。クラウド上のデータをローカルにダウンロードしてバックアップする場合、インターネット帯域の制約を受ける。オンプレミスなら数Gbpsの帯域を使えていた物が、インターネット経由で行う場合には数十Mbps程度になってしまう。例えローカルの環境が1Gpbsでインターネットに接続していたとしても、仮想マシン側のインターネット通信帯域は数十~数百Mbps程度でしかないため、何も考えずにフルバックアップ等していては時間がかかってしかたがない。またデータ転送量も従量課金の対象となるので無駄に代金を払うことになる。
・・・ではバックアップ無しで良いかというと、そうはいかない。パブリッククラウドを使用している場合、ベンダー側の都合でサービスの使用が変更になったり、終了したり、あるいはベンダーが事業から撤退したりと言うことが常に起こる。既にHP Helion Public Cloudも撤退しているし、VMware vCloud Airは日本市場から撤退を決めている。IaaSでサービスを終了した事業者はまだそれほど多くないが、SaaSやPaaSも含めると市場から消えたサービスはさらに増える。サービスが終了したとき、他のサービスへの移行手段としてバックアップが必ず必要になる。

「小学生の頃、習っていないことを勉強していたら『実力差がついちゃうからしないでね』と先生に言われた」のを無理矢理弁護してみる

小学生の頃、習っていないことを勉強していたら『実力差がついちゃうからしないでね』と先生に言われた→多くの人が同じ経験をしていた – Togetterまとめ

無理矢理弁護してみる。

日本の教育システムが到達度別クラスとか、少人数クラスになっているのであれば何も問題はない。だが残念なことに40人者大人数で、到達度など関係なく同じ地域に住む同じ年齢の子供を集めて教えるようになっている。

到達度の全く異なる人たちを対象に、全員が満足する授業を行うというのは難し・・というより不可能に近い。これが大人相手なら、全く異なる勉強をしたりしながら、時間を有意義に、到達度の低い生徒の邪魔する異なく過ごせるだろう。だが残念な事に小学生相手だとそうはならない。退屈した生徒は騒ぎ初め、到達度の低い生徒の邪魔を始めてしまうのだ。

本来問題なのはこのような発言をする先生ではなく、到達度に関係なく同じ年齢の子供を沢山集めて教えるというシステムの方だろう。実際に到達度別クラス分けとか、少人数クラスにしたりとか、補助教員を置いて到達度の高い生徒はより高度なことを出来るようにしているとか、そういった事例は海外に沢山ある。

算盤とかピアノとか、学校の授業と全く関係の無い事を学ぶのなら問題は無いのだろうけど・・・。

仮想マシンをバックアップする(Cloud向け開発の覚書き )

最低でも三重にレプリケーションされており物理障害でデータが失われる可能性は非常に少ない。とはいえ、必ずクラウドの機能を使って仮想マシンのバックアップを取得するようにしておく。
クラウドではオペレーションミスによってデータを失う可能性はむしろ高いので注意が必要になる。管理コンソールの操作ミスによって仮想マシンやストレージを削除してしまうのは勿論、仮想OSの操作ミスでSSH接続などリモートセッションの設定を破壊してしまった場合、バックアップした仮想OSを戻す事が出来なければデータ復旧は絶望的になる。
例えば私はLinuxでapt-get upgradeを実施したときに、仮想マシンのエージェントの更新がかかり、操作ミスで設定ファイルを上書きしてしまったことがある。もちろんSSHによる接続は出来ない。クラウドの管理コンソールから新しいSSHキーを設定するも動かず、バックアップされていた仮想マシンをロールバックすることで対応した。

揮発性ストレージを活用する(Cloud向け開発の覚書き)

クラウドでもオンプレミスでも、仮想OSは物理PCに比較してディスクIOのパフォーマンスが低く、この部分がボトルネックとなりやすいです。そのために頻繁なディスクIOが発生する用途ではパフォーマンスが得られにくいという欠点があります。 クラウド上の仮想マシンでのパフォーマンス改善には、仮想ディスクへのIO負荷を如何に減らすかが、最初に検討すべき重要な要素になります。
仮想PCマシン割り当てられる揮発性ストレージ(EC2では インスタンスストア)を活用できないか検討することをお勧めします。揮発性のため仮想PCが停止した場合はデータが失われますが、専用に割り当てられており、物理PCと遜色ない速度でアクセスすることが出来ます。起動後に必要なフォルダやファイルを作成したり、シャットダウン前や低周期でファイルを退避したり、一手間必要になりますが効果も大きいです。

最初からスケールアウトを考慮する(Cloud向け開発の覚書き )

オンプレミスでは当たり前に使っていたこともあり、 ついリレーショナルデータベースを使いたくなります。リレーショナルデータベースは一貫性を保つために、更新処理を排他的に実行します。頻繁なファイル更新を伴い、広大なメモリ領域を必要とするために、もともと仮想マシンとは相性が悪いのです。
Amazon RDSやAzure SQLでは仮想サーバーと相性の悪いRDBをクラウド上で利用しやすいように最適化しています。ですがスケールアウトにはすぐに限界が来ます。テーブル単位でしか分散できなかったり、無制限にスケールできるというものではないという認識が必要です。
将来的にスケールアウトを考えているなら、最初からスケールアウトに適したテクノロジを採用できないか検討する必要があります。

Windows Updateで繰り返しエラーコード80073701が発生する場合の対処法

Windows Updateで繰り返しエラーが発生する場合の対処法でも直らなかったので、続き・・・

と言うわけで様々な方法を試してみても回復せず。当初80070003だったエラーコードも、対応を続けている内に80073701に変わってしまい、相変わらずインストールできない。そこで、Windows Updateが出力するエラーログを解析して、対処方法の見当をつけることにする。

Windows Updateを実施したときのログはC:\Windows\Logs\CBS\CBS.logに保存されている。エラーが発生するとログファイルも異常に大きな物になっているため、普通にメモ帳では開けない可能性があるので注意。私の場合には1.2GBを超える巨大ファイルになっていた。このファイルの中から「日時, Error~」となっている場所を検索する。

2016-04-12 03:21:12, Error                 CSI    00000017@2016/4/11:18:21:12.414 (F) d:\win7sp1_gdr\base\wcp\componentstore\csd_locking.cpp(324): Error STATUS_SXS_ASSEMBLY_MISSING originated in function CCSDirectTransaction::LockComponent expression: (null)
[gle=0x80004005]
2016-04-12 03:29:39, Error                 CSI    00000018 (F) STATUS_SXS_ASSEMBLY_MISSING #520062# from CCSDirectTransaction::OperateEnding at index 0 of 1 operations, disposition 2[gle=0xd015000c]
2016-04-12 03:29:39, Error                 CSI    00000019 (F) HRESULT_FROM_WIN32(ERROR_SXS_ASSEMBLY_MISSING) #519947# from Windows::ServicingAPI::CCSITransaction::ICSITransaction_InstallDeployment(Flags = 0, a = fe9c22555b6f13ab7c014ac3462882cc, Version = 6.1.7601.18658, pA = PROCESSOR_ARCHITECTURE_INTEL (0), Culture neutral, VersionScope = 1 nonSxS, PublicKeyToken = {l:8 b:31bf3856ad364e35}, Type neutral, TypeName neutral, PublicKey neutral, cb = (null), s = (null), rid = [77]"Package_30_for_KB3011780~31bf3856ad364e35~x86~~6.1.1.5.3011780-85_neutral_GDR", rah = [2]"16", manpath = (null), catpath = (null), disp = 0)[gle=0x80073701]
2016-04-12 03:29:39, Info                  CBS    Failed to begin deployment installation for Update: 3011780-85_neutral_GDR [HRESULT = 0x80073701 - ERROR_SXS_ASSEMBLY_MISSING]

ERROR_SXS_ASSEMBLY_MISSINGの発生している行を見ると「rid = [77]”Package_30_for_KB3011780~31bf3856ad364e35~x86~~6.1.1.5.3011780-85_neutral_GDR” 」となっており、KB3011780の依存関係を解決する過程でエラーになっていたことが分かる。

どうもKB3011780が正常にインストールできていないことが原因のようなので、「更新プログラムのアンインストール」からKB3011780を探してアンインストールする。KBKB3011780のアンインストール後にWindows Updateから更新プログラムの確認を行うと、先ほどまでエラーになっていた更新に加えてKB3011780もインストールすべきアップデートとして表示されるので、そのままWindows Updateを適用する。

私の場合は先ほどまでエラーになっていた15個に加えて、今アンインストールしたKB3011780を加えた16個が表示され、内13個のインストールに成功。残3個がエラーとなった。OSの再起動後にあらためてWindows Updateから更新プログラムの確認を行い、エラーとなった残3個のアップデートのインストールを試みる。・・・が、再びエラーコード80073701になってしまった。あらためてログファイルを確認する。さっきよりも大分小さい300MB程度になっている。

2016-04-12 12:58:22, Error                 CSI    0000001f@2016/4/12:03:58:22.544 (F) d:\win7sp1_gdr\base\wcp\componentstore\csd_locking.cpp(324): Error STATUS_SXS_ASSEMBLY_MISSING originated in function CCSDirectTransaction::LockComponent expression: (null)
[gle=0x80004005]
2016-04-12 12:58:23, Error                 CSI    00000020 (F) STATUS_SXS_ASSEMBLY_MISSING #31564# from CCSDirectTransaction::OperateEnding at index 0 of 1 operations, disposition 2[gle=0xd015000c]
2016-04-12 12:58:23, Error                 CSI    00000021 (F) HRESULT_FROM_WIN32(ERROR_SXS_ASSEMBLY_MISSING) #31449# from Windows::ServicingAPI::CCSITransaction::ICSITransaction_PinDeployment(Flags = 0, a = Microsoft-Windows-RemoteDesktopClient-WinIP-Deployment, Version = 7.2.7601.16415, pA = PROCESSOR_ARCHITECTURE_INTEL (0), Culture neutral, VersionScope = 1 nonSxS, PublicKeyToken = {l:8 b:31bf3856ad364e35}, Type neutral, TypeName neutral, PublicKey neutral, cb = (null), s = (null), rid = [118]"Microsoft-Windows-RemoteDesktopClient-BlueIP-Package~31bf3856ad364e35~x86~~7.2.7601.16415.RemoteDesktopClient81-BlueIP", rah = (null), manpath = (null), catpath = (null), ed = 0, disp = 0)[gle=0x80073701]
2016-04-12 12:58:23, Info                  CBS    Failed to pin deployment while resolving Update: RemoteDesktopClient81-BlueIP from file: (null) [HRESULT = 0x80073701 - ERROR_SXS_ASSEMBLY_MISSING]
2016-04-12 12:58:23, Info                  CBS    Failed to resolve item[0] in Package: Microsoft-Windows-RemoteDesktopClient-BlueIP-Package~31bf3856ad364e35~x86~~7.2.7601.16415, Update: RemoteDesktopClient81-BlueIP [HRESULT = 0x80073701 - ERROR_SXS_ASSEMBLY_MISSING]
2016-04-12 12:58:23, Info                  CBS    Failed to resolve execution update. [HRESULT = 0x80073701 - ERROR_SXS_ASSEMBLY_MISSING]
2016-04-12 12:58:23, Error                 CBS    Failed to resolve execution package: Microsoft-Windows-RemoteDesktopClient-BlueIP-Package~31bf3856ad364e35~x86~~7.2.7601.16415 [HRESULT = 0x80073701 - ERROR_SXS_ASSEMBLY_MISSING]
2016-04-12 12:58:23, Info                  CSI    00000022@2016/4/12:03:58:23.948 CSI Transaction @0x1738ce0 destroyed
2016-04-12 12:58:23, Info                  CBS    Perf: Resolve chain complete.
2016-04-12 12:58:23, Info                  CBS    Failed to resolve execution chain. [HRESULT = 0x80073701 - ERROR_SXS_ASSEMBLY_MISSING]
2016-04-12 12:58:23, Error                 CBS    Failed to process single phase execution. [HRESULT = 0x80073701 - ERROR_SXS_ASSEMBLY_MISSING]

今度は「rid = [118]”Microsoft-Windows-RemoteDesktopClient-BlueIP-Package~31bf3856ad364e35~x86~~7.2.7601.16415.RemoteDesktopClient81-BlueIP” 」とあります。どうもリモートデスクトップクライアントが正常にインストールできていないようです。RemoteDesktopClient81とあることから、Remote Desktop Client 8.0から8.1へのアップデートが上手く適用できていないと思われれます。KB2803477 Update for RemoteApp and Desktop Connections feature is available for Windowsを先ほどと同じ要領でアンインストールしてから、あらためてインストールし直します。

もういちどWindows Updateを実行した結果、ついに残りのエラーは1個になりました。
OSを再起動して、さらにもう一度Windows Update(何度か繰り返す)・・・・Complete!
全てのWindows Updateを無事に適用できました。

もしWindows Updateで修復不能なエラーに悩まされたなら、CBS.LOGをのぞいてみて下さい。

PS…
Windows 8.1またはWindows 10であれば次のようにdismコマンドで壊れた環境を修復できる場合があるようです。

> dism.exe /online /cleanup-image /restorehealth

残念ながらWindows7ではrestorehealtオプションがありません。エラーを報告はしてくれるが、修復はしてくれないので、手作業でアンインストール/インストールを繰り返す以外にありません。

Windows Updateで繰り返しエラーが発生する場合の対処法

WEBで検索するとWindows Updateで繰り返しエラーが発生する場合の様々な対処法を見つけられるが、特定のセキュリティパッチ限定の方法だったり、汎用性がなかったり、自身が遭遇している問題とは関係なかったりする。そのため適切な対処方法になかなか巡り会えずに、困っている人も多いのじゃないかと思う。

次の手順がおそらく最も汎用性があって、ほぼ確実に不具合を修復出来ると思う。

1. オフィシャルのトラブルシューティングガイドを使う

あいにくと英語のページしかありませんが「I got an error code from Windows Update」と言うページがあります。こちらでOSの種類とエラーコードを入力すると、それに対応した修復手順を案内してくれます。頻繁に情報もアップデートされているようで、これが最も確実な対処法になるとおもう。

2. それでもよく分からない場合は・・・

よく分からない場合には、最も汎用性が高いと思われる、次の手順をお勧めします。
次の操作は管理者権限を持つユーザーで行って下さい。

2.1. OSのシステムファイルを修復する

https://support.microsoft.com/ja-jp/kb/929833
コマンドプロンプトを右クリックして「管理者で実行」を選択します。
コマンドプロンプトが開いたら次のコマンドを実行します。
sfc /scannow
システムファイルの修復が終わったらOSを再起動します。

Windows Updateが異常中断したためにシステムファイルの整合性が壊れたのが原因の場合には、これで直るはずです。

2.2. Windows Updateのバージョンを更新する

https://support.microsoft.com/ja-jp/kb/949104
上のページから使用しているOSにあわせて最新のWindows Update Agentをダウンロードしてインストールします。
インストールが終わったらOSを再起動します。

Windows Updateのバージョンに起因する問題の場合は、これで直るはずです。

2.3. 自動解決ツールを利用する

https://support.microsoft.com/ja-jp/gp/windows-update-issues/
上のページの「更新プログラムのインストールで問題が発生する場合、どうすればよいですか。
」から「Windows Update のトラブルシューティング ツール」をクリックして「WindowsUpdateDiagnostic.diagcab」をダウンロードします。ウィザードに従って次へ次へと進んでいくと、自動的に問題を修復してくれます。
「最新の更新プログラムのインストールに関する問題」が[未解決]と表示されますが、これは未適用のWindowsUpdateがあると言う意味(WindowsUpdateに失敗しているのだから当たり前)なので気にしなくて良いです。
修復が終わったらOSを再起動します。

Windows Updateが作成する作業ファイルや、ダウンロードしたファイルの破損などに起因する問題は、これで直るはずです。

グループポリシーでPCにログインできるユーザーを制限するには

グループポリシーでコンピューターにログインできるユーザーを制限するには、グループポリシーの「コンピューターの構成→Windowsの設定→セキュリティの設定→ローカルポリシー→ユーザー権利の割当→ローカルログオンを許可」の設定を有効にします。

この設定を有効にすると各PCのログインを許可するユーザーグループが全て設定値に置き換えられます。通常は「Administrators、Backup Operators、Power Users、Users、Guest」の5つのユーザーグループが登録されています。このうち「Users、Guest」を除く「Administrators、Backup Operators、Power Users」に加えて、ログインを許可したいユーザーグループをログインを許可するユーザーグループとして登録します。

例えば「ほげ」というユーザーグループにアクセスを許可したい場合には、「Administrators、Backup Operators、Power Users、ほげ」の4つのユーザーグループを設定します。

誤って「Administrators」を設定に加え忘れると、管理者もログイン出来なくなるため非常に困ることになります。気をつけましょう。

locallogon