y-cruncher は旧OSで起動出来るか?

 円周率計算でギネスブックに掲載された事で有名になった y-cruncher ですが、特徴として複数CPUを使ったマルチスレッドで高速化している事と、最新の拡張命令( AVX2 / AVX / SSE4など)を任意に(ユーザが指定出来る)使って高速に円周率の演算が出来、ベンチマークとして活用出来ます。

 この y-cruncher の旧バージョンにはSSEを使わないVer0.5.5.9180 x86バイナリも有りますので、これを使って旧OS(WindowsNT3.51/NT4.0/2000)で起動出来るか?試してみました。

 つまり386~586(P5)世代の古いCPUで試してみたくなったのです※8

 結論としては、Windows2000 と MMX Pentium の組み合わせで実行出来ましたが、簡単には実行できませんでしたので、そこに至る経緯を記録として残しておきます。386~P5までは未だ試していませんが、Windows2000のシステム要件としてPentium133MHz(つまりP54C)が条件ですから、なかなか厳しい状況です。

 y-cruncherはVC++2008/2010でコンパイルしている事が理由でWindows2000やWindowsNTでは起動出来ない様です。Win32互換でプログラミングしてもVC++2008/2010が意図的に旧OSでの起動を禁止するヘッダをアプリに埋め込む為、製作者の意図に関わらず旧OSでは起動出来ない仕組みに成っている様です。加えて、y-cruncher独自の機能として記録の偽造を防止する為と思われますがexeバイナリを変更すると不正な変更があるという趣旨のエラーメッセージを表示して強制終了するプログラムが埋め込まれていますので、ヘッダを修正するとOSバージョンに関係なく実行出来ないexeファイルに成ってしまいます。が、後述する非公式な回避手段でWindows2000では起動できる様になりました。NT3.51/NT4.0は試行錯誤中です。(参考までにVC++2012/2013/2015でコンパイルするとデフォルトではWindowsXPでも起動不可になりますが、プロジェクトのプロパティ -> 構成プロパティ -> 全般 -> プラットフォームツールセット の変更でXPへの対応が可能です。)

 ちなみに y-cruncher はDOS窓で動作する テキストUI / CLI のアプリです。

例1:
 プログラミング上はWin32互換でも、VC++2008がNT3.51/NT4.0では強制的に起動禁止になるヘッダを埋め込む為、プログラム的には互換性が有っても起動が出来ない仕組みに成っている様です。同様にVC++2010以降でコンパイルするとWin2000でも強制的に起動禁止になるヘッダが埋め込まれます。
NT3.51
2008atNT3.jpg
NT4.0
2008atNT.jpg
2000
2010at2000.jpg
 どんなに頑張ってWin32互換のプログラミングをしてもVC++2010でコンパイルするとWindows2000に「Win32アプリではない」と断定されてしまうのは悲しいですね。

例2:
 テキストファイル等の拡張子を.exeに変更してNT3.51/NT4.0/2000で起動した場合(つまり起動禁止ヘッダが無く、かつ、有効なアプリではないexeファイル)では、上記とは異なり、下図の様に16bitアプリとして処理されます。
NT3.51
警告無しでフリーズしますが、DOS窓を強制終了すれば回復します。
TXTTOEXE351.png
NT4.0
TXTTOEXE.jpg
2000
TXTTOEXE2K.jpg

 これらを回避して、旧OSでも起動出来るWin32アプリを作成する為には、同じソースコードをVC++6.0でコンパイルし直せばOKの様です。が、y-cruncherのソースコードは非公開ですから、自分でコンパイルする事が出来ません。

 y-cruncher Ver0.5以降はSetFileValidDataを利用している為、公式にはWindowsXP/2003以降のカーネルが必須ですが、非公式には回避手段(後述)が有り、Windows2000での起動には成功しました。NT3.51/NT4.0での起動には未だ成功していません。SetFileValidDataはギネス記録を目指す人向けに超巨大ファイルを予め確保する為の仕組みで、10億桁程度でベンチマークするだけの人向けには実質的には何もしていないので、ソースコードからVC++6.0でコンパイルするのであれば、単に呼び出し元をコメントアウトするだけでOKと思われます。が、既にコンパイル済みのexeファイルを実行するには、Kernel32改造計画の様なDLLラッパーや、Wineの様な互換レイヤー(両者は、ほぼ同じ仕組み)が必要と思われます。

 y-cruncher は上記以外にもSetFilePointerEx を利用している為、公式にはWindows2000以降のカーネルが必須で、NT3.51/NT4.0で実行するには上記同様にラッパーや互換レイヤーが必要と思われます。SetFilePointerEx は2GB(20億バイト)以上のファイルサイズで必要になる機能ですから、こちらもギネス記録向けの機能と言えます。同様の機能を持ち、かつ、NT3.51/NT4.0で利用可能なSetFilePointerに置き換えるだけの単純なラッパーで代替可能ではないか思われます。

 他に y-cruncher 実行に必要なものとして、メモリサイズがあります。搭載メモリが128MB有ってもWindows2000を実行していると概ね半分の60MB程度しか利用可能な物理メモリの空きが無い為、200万桁の演算が精一杯です。

 動作検証は実機ではなく20号機(AbuDhabi)上のVMWare Workstation 7.0 仮想マシン上で 2 CPU 構成にて検証しています(その方がサクサク進められる為)。

 試行錯誤の結果、とりあえずWindows2000では起動出来る様になりましたので、MMX-Pentium 233MHz SMP ( 2 CPU ) 構成で後ほど試してみます。

以下に、検証結果を記録しておきます。
Windows NT 3.51 Workstation SP5
OSシステム要件:80386 25MHz / 12MB / SMP / VGA
y-cruncher v0.1.0.6013a: × ※6
y-cruncher v0.2.1.6841a: × ※6
y-cruncher v0.3.2.6953a: × ※6
y-cruncher v0.4.1.7408. : × ※6
y-cruncher v0.4.4.7762b: × ※6
y-cruncher v0.5.5.9180. : × ※6
SuperPI Ver1.1      : ○

Windows NT 4.0 Workstation SP7
OSシステム要件:80486 25MHz / 12MB / SMP / VGA
y-cruncher v0.1.0.6013a: × ※6
y-cruncher v0.2.1.6841a: × ※6
y-cruncher v0.3.2.6953a: × ※6
y-cruncher v0.4.1.7408. : × ※6
y-cruncher v0.4.4.7762b: × ※6
y-cruncher v0.5.5.9180. : × ※6
SuperPI Ver1.1      : ○

Windows 2000 Professional SP4
OSシステム要件:Pentium133 / 32MB / SMP / SVGA
y-cruncher v0.1.0.6013a: ○ ※1
y-cruncher v0.2.1.6841a: ○ ※1
y-cruncher v0.3.2.6953a: ○ ※1
y-cruncher v0.4.1.7408. : ○ ※1
y-cruncher v0.4.4.7762b: ○
y-cruncher v0.5.2.9025a: × ※2
y-cruncher v0.5.3.9134b: × ※2
y-cruncher v0.5.5.9179. : × ※2
y-cruncher v0.5.5.9180. : × ※3
SuperPI Ver1.1      : ○

Windows 2000 Professional SP4 + KB2722913 + KB957579 + Kernel32改 v2.5f4 ※7
※KB2722913には高度暗号化パッチ又はWindows2000用のIE8が必要です。
同様の改造をWindowsNT3.51/4.0で実現できれば・・・
y-cruncher v0.4.4.7762b: ○
y-cruncher v0.5.5.9179. : ○
y-cruncher v0.5.5.9180. :
SuperPI Ver1.1      : ○

Windows XP Professional SP3
OSシステム要件:Pentium233 / 64MB / SMP / SVGA
y-cruncher v0.4.4.7762b: ○
y-cruncher v0.5.5.9179. : ○
y-cruncher v0.5.5.9180. :
SuperPI Ver1.1      : ○

ReactOS 0.3.17 REL (Windows2000互換フリーOS)
OSシステム要件:Pentium / 96MB / UniProcessor / VESA 2.0
y-cruncher v0.4.4.7762b: △ ※4
y-cruncher v0.5.5.9179. : △ ※4
y-cruncher v0.5.5.9180. : ※4
SuperPI Ver1.1      : △ ※5

Linux + Wine
OSシステム要件:工夫次第か?
y-cruncher v0.4.4.7762b: 検証予定
y-cruncher v0.5.5.9179. : 検証予定
y-cruncher v0.5.5.9180. : 検証予定
SuperPI Ver1.1      : 検証予定

------------------------------ 
※1:Microsoft Visual C++ 2008 Redistributable が必要
※2:SetFileValidDataを利用している為、公式にはWindowsXP以降のOSが必須
※3:有効なWin32アプリケーションではありません(VC++2010起因)
※4:シングルコアで実行されます。
※5:日本語が正しく表示されません(ReactOS 0.3.10 では日本語表示OK)
※6:有効なWindowsNTアプリケーションではありません(VC++2008起因)
※7:改造にあたりI/F部分のリバースエンジニアリングをされていますが、こういったケースでのI/F部分のリバースエンジニアリングは法律で許容されている様です
※8:残念な事にLinux向けのy-cruncherは64bit版しか公開されていませんので、WindowsNT/2000での検証ですが、良好な結果が得られない場合の最終手段として Linux + Wine も検討しています。
 
関連記事
スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

DualSocketTheWorld

Author:DualSocketTheWorld
自作を始めて20台目くらいになりますが、最初からデュアルソケット限定(始めた当時はデュアルスロット)で自作しており、近年になってAMD K6を試したくなりSocket7でK6-2+のシングル構成で組んだのがシングル初です。

シングルマザー(含:シングルソケットマルチコア)や4ソケット以上の自作は基本的にしませんし、メーカー製PCの改造も基本的にはしません(ノートPCのSSD化くらいはしますが・・・)

基本路線はワークステーションと呼ばれる分野での自作で、OSもWindows系であればProfesionalが主な対象に成ります。

ゲーマーの様なOverClockは行わず、WS路線としてハイエンドCPUとハイエンドGPUの組み合わせで定格或いはDownClockで発熱を抑えつつ、その時のアーキテクチャに置いて爆速かつ静音を目指し、30年以上の長期に渡り稼動状態をキープする事を目指します。

※基本的にリンクフリーです。どこでも自由にどうぞ。

※画像は時々変ります。

※お決まりの文章ですが、改造は個人の責任で行ってください。ここに記載された情報は間違いを含んでいる可能性が有り、それを元に製作や改造などをして失敗しても筆者は一切責任持てませんので悪しからず。

筆者略歴:
小学生時代にゴミ捨て場で拾ったジャンクテレビ数台を分解して部品を取り出し真空管アンプを自作、中学生時代にPC8801mkⅡsrでZ80アセンブラを始める。社会人になって初のプログラムは弾道計算、後に医療系・金融系プログラマ~SEを経て100~200人規模プロジェクトのジェネラルマネジャを数年経験、独立して起業。現在は不動産所得で半引退生活。
(人物特定を避ける目的で一部経歴を変更しています)

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
アクセスカウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR