20世紀~2004年位まではシングルスレッドのCPUしかない時代なので、フォアグラウンドとバックグラウンドで別の作業をするという概念が存在しませんでした。それを行う場合には、ワークステーションなどのソケット数の多いものを選択するしかない時代ですから、現在で当たり前にできる作業が全くできないような構造物しかありませんでした。

 

 この状態が変わったのが、Socket 478のPentium 4 3.xEGHz のシリーズで、この製品はSocket 478で登場したPrescottコアの製品になります。革新的な機能をいろいろと詰め込んだものになっていますが、LGA推移する過渡期に登場した最後のSocket478の製品になります。

 

 この製品で搭載されていた機能の一つにSMTがありますが、現在ではCore i3にも実装されているHyperThreadingは、この時代に登場しています。その後、Core MA世代ではこれがなくなったのですが、Core Insideシリーズでは復活し、現在では13世代の製品がリリースされています。AMDはネイティブコアを増やしてパフォーマンスを上げるアプローチをしていたのですが、6コアの製品や8コアの製品なども登場していましたが、Ryzenシリーズでは、SMTを実装して物凄いスレッド数のCPUをリリースしています。そして、キャッシュの量もどんどん増加し、L3キャッシュについても3D-Vキャッシュというテクノロジーでさらに増大されています。この技術はRADEONにも採用されていますが、Ryzen 3Dシリーズでは、L3キャッシュが物凄い事になっています。

 

 このよにスレッド数が増えて現在では、Celeronでも2コアでCore MAでは太刀打ちできない状態で、最新のものだと、シングルコア動作をする処理については初代のCore i7を超えているので相当な速度になっています。また、Pentiumも4スレッド動作ですから、特定の世代のCore i5よりも高いスコアが出ますし、この辺りのグレードだとゲーミング用途だとRTX 3060あたりまでだとそれほどパフォーマンスの低下もなく動いてくれます。なので、GTX 1660TiとかRTX 3050とかだとごく当たり前にGPUの性能を引き出してくれます。なので、遅くなる場合にはCPU依存度の高い処理が生じたときのみという状態なので結構動いてくれます。

 

 こうした性能になっているので、12世代以降のCore i3が凄いのですが、こうした製品でも特定のグラフィックボードまでだとボトルネックが生じにくくなっているのでできることも増えています。ただし、制作用途だとCore i5やRyzen 5以上が加減で、できれば、スレッド数やキャッシュの容量の多いCore i7やRyzen 7以上のものを選択することになります。

 

 現在は、2スレッド以上のCPUが当たり前になっていますし、ギガスクール構想のPCですら4スレッドですから、4スレッド以上が当たり前の時代になっていますから、プロセッサのCPU使用率に余裕がある処理の場合だと、バックグラウンドで計算をさせながらフォアグラウンドで作業をするような処理ができるようになっています。

 

 

  マシンスペックが高い場合

マシンスペックを高くすると、

  •   3DCG               
  •   映像制作            
  •   コンポジション  
  •   ゲーム制作         

などができますが、スペックを上げるほど作れるものの選択肢は増えます。どの作業も共通してメモリーが多いほうがいいので、基本的には16GB以上は用意したほうがいいのですが、この作業だとCPUのスペックもそうですが、GPUの性能も少し高めにしたほうが作業がしやすくなります。

 

 とりあえず、フルHDの映像制作だと現在はiPadでもできる時代ですし、M1だとiPad版のDavinciResolveが動く時代ですから、映像も簡素な作りだとiPaddemoできる時代になっています。

 

 ただし、PCのほうができる処理顔いので、MAC版とは異なる仕様になっていますが、基本的にフルHDの動画を扱う場合だと、現在のCPUだとPentium G7400辺りでもできますし、AVCHDだとその構成でIGPであってもメモリーをしっかり積んであれば作業ができてしまいます。映像を作る鵜場合、映像素材が何で、トラックが何本あるのかで負荷が変わってきますが、重たい素材を使う場合にはプロキシを使ってもHDDでは無理ですし、SATAだと帯域が足りません。そこでメモリーの帯域も必要になりますが、それと同時にストレージの帯域と転送時の速度も重要になってきます。

 

 そうなると、重たいソースを扱う場合にはNVMeのSSDを使うこと担いますが、この時にPCI Expressバスの世代が新しいほど高速なるので世代の新し物を選択することになります。

 

 映像制作の場合、再生時のキャッシュをメモリーに展開できるのですが、こうした処理をする際にメモリーの容量の割り当てをして作業をすることになります。そのため、メモリー搭載量は多ければ多いほどいいのですが、こうした内容はマッチムーブを行う際にも必要になります。

 

 3DCGの場合、オブジェクトをどの程度のポリゴン数で作るのかを考える必要がありますが、ハイポリモデルの場合だと億単位のポリゴン数を処理することになります。このあたりもアーキテクチャが新しいと極当たり前に出来てしまうわけですが、ハイポリモデルを作る際にはSculptモデリングのように直感的なモデリングを行うこともできます。

 

 ハイポリモデルの場合、メモリーを多く消費するので、こうした作業をする際にはメモリー搭載量を多くしておくひつようがあります。

 

 3DCGと映像で共通しているのは、動くものをプレビューしたときにコマ落ちがなく、指定したフレームレートでしっかりと再生できていることになりますが、ここはかなり重要なので、政策をするPCの場合、この作業が快適に行える構成にしておく必要があります。

 

 3DCGAの場合だとシーン内で多くのポリgン数が使用できることも重要ですが、マテリアルビューなどでリグを実装したキャラを動かしてみたときにしっかりとプレビューできることを基準に選ぶと作業がしやすくなります。(fps数が足りない場合だと、重たい処理を間引いたモデルを用意して主要な部分だけ計算して、それにほかのものを足した状態で動きをつくることになりますが、できるだけ、セットアップしたものが動く状態になる構成にしたほうがいいです。)

 

 PCで作業をする場合、PCの演算性能の上限を基準としてそれ以内の処理で作業を行うことになるので、マシンスペックが低くなるとその分作業内容を変える必要がありますし、マシンスペックが高ければその分だけ自由度は高くなります。

 

 

  スレッドが多い場合

 

 近年のCPU はSMT対応でスレッド数を多く使用できるのですが、この構成の場合、ワンオペでも作業の同時進行ができます。

 

 先ほど書いた作業では、コンピューターが長時間演算を行う処理が発生するのですが、この時間をコンピューターを放置しておくことになります。なので、別のことをその間にできるので、計算中にアナログの作業をしたり、日常の作業を行うこともできます。制作を行っている企業の場合だとこの計算はワークステーションとは別のレンダリングファームにリクエストを送って行っているはずなので、同時進行で別の作業が進んでいると思います。

 

 ワンオペの場合も同様にマシンスペックをあげておくと同じような事ができます。これは、個人の趣味でも同じことができるのですが、PCUのスレッド数が16ある場合だと、速度は遅くなりますが、

  •   フォアグラウンド   : 8
  •   バックグラウンド   : 8

 

というスレッドをわけることができます。これを、

 

  •   フォアグラウンド   : 作業用のツール
  •   バックグラウンド   : レンダリング

 

で割り当てておくとそのスレッド以上は使用しなくなるので、フォアグラウンドの作業でバックグラウンドが重くなることはありません。また、フォアグラウンドのスレッド数を6にしてアップデートなどが入った時の予備にしておくこともできますが、8スレッドもあるとがそう所理もできるので、

 

  •   フォアグラウンド   : テクスチャの制作
  •   バックグラウンド   : レンダリング

 

も行えるようになります。当然、この比率を

 

  •   フォアグラウンド   : 4
  •   バックグラウンド   : 12

 

のようにすることもできますから、レンダリング時のスレッド数を決めておくことでそれ以上のスレッドを使わなようにできるのでこうした処理ができます。当然、テキスト関連の作業だともっと負荷が少ないので影響が出ないのですが、シーンが完成していて、リクエストをタスクで送って実行するだけの状態だとその間に別の作業ができますから、日常での作業を行ったり、別の作業の準備を行うこともできます。この時にPCでの作業だと、リアルタイム処理だと遅延が出る恐れがあるので、遅延の影響受けないものであれば、バックグラウンドで計算をしている間に作業を進めることができます。

 

  この辺りは、Core i3やRyzen 3あたりでも行えるのですが、スレッド数が多いほど速度がでます。また、GPUレンダリングの場合だと、GPUのグレードが高いほど処理速度が早くなります。

 

 ちなみに、CGAの場合、音を合わせるのは後の作業になりますから、基本的にはサイレンスの状態で素材を作ることになります。この時に動画ファイルとして書き出すこともできますが、動画で書き出すとレンダリング時にエラーが出ると再生不能なファイルが出来上がってしまいます。そのため、時間が無題にならないようにするためにもレンダリング時には動画ファイルではなく、シーケンシャルを画像ファイルで書き出すことになります。

 

 3DCGツールでは、スピーカーオブジェクトがあるのでシーン愛にオブジェクトを配置するとカメラから見た位置で音を鳴らすことができるのですが、この音の状態をオーディオファイルでミックスダウンして出力することもできます。なので、シーン内の音も必要な場合だと、シーケンシャルとミックスダウンしたオーディオファイルを個別に出力してトラック編集をする際に合わせて使うことになります。

 

 

  仮想化

 

スレッドが多いCPUの場合、前述のようにOS上でスレッド数を決めていて計算と作業の同時進行ができるのですが、この場合だと1つのOS上での作業しかできません。

 

 つまり、違うOS を使用する際には別の方法を選択することになります。その場合、ブートローダーで別のOSを切り替えて使う方法もありますが、この場合、一旦シャットダウンをしてから別のOSを起動させる必要があります。

 

 この機能はIntel MACのBootcamp も同様のものになりますが、Linuxに切り替える場合だと、別途Linuxをインストールして使用することになります。

 これとは別の方法として、ソフトウェアでそのOSの機能を使うアプリケーションレイヤーソフトがありますが、ハードウェアのエミュレーションを行うことでその機能を再現できるものもあります。これは、Android StudioのAndroidエミュレーターが有名ですが、アーキテクチャ上で動くものを再現したものがこれになります。

 LinuxのWineのようにWINDOWSのアプリケーションを動かせるものもありますが、WINDOWSだとC++を使う際にLinuxのコマンドが必要になるので、MInGWやCygwinなどをインストールしてコンパイル環境を作ることになります。

 

 このように別の環境を使う場合にはいろいろな選択肢がありますが、 [ OSの乗ったPCをOS上で動かす ] という選択もあります。

 

 LinuxにはQEMUやKVMがありますし、XENも使用できるのですが、クロスプラットフォームのVirtualBoxなども存在します。このように多くの選択肢が存在しているわけですが、WINDOWS環境でもWINDOWS 7 Pro版にはマイクロソフト製のホスト型の仮想化環境のVirtual PCが実装されており、後方互換のためにXPモードが実装されていました。10ではPro版でハイパーバイザー型のHyper-Vが実装されたわけですが、こうした環境は、PCの中に別のPCを作成して設定したスペックに合わせたマシン上でOSを動かして運用することができるようになっています。

 

 例えば、Core i3で8スレッドが使用できる場合で16GBのメモリーを搭載している環境で、ストレージが1GBだと、VT対応の条件を満たしていれば、

 

  •   CPUコア数   : 4
  •   メモリー       : 8GB
  •   VRAM           : 128MB
  •   ストレージ    : 256GB

のPCを作ってPC上で動かすことができます。これを、

  •   Linux            
  •   BSD              
  •   Android x86  
  •   Solaris          

などをインストールしてしようすることができます。当然、ライセンスを購入すれば、WINDOWSを別にインストールすることもできるのですが、MA OSの場合MACでしか使用できないので、WINDOWSやLinux環境だと使用するとライセンス違反になります。

 こうした環境を作ることで、実機の前に仮想環境で指定した仕様のマシンでアプリケーションのテストができるのですが、OS依存のあるネイティブなコンパイル型言語のコンパイルも行うことができます。
 

 このようにコア数が多いと仮想化環境を使うことができるのですが、最新版のWINDWS 10にアップデートしておく(必要があります。というのも21H1のサポート期間が切れるので22H2にしておく必要があります。)と無印のWINDOWS 10でもWINDOWS上出でLinuxが動作するWSL2を使用することができます。

 

 設定が煩雑ですが、指定後にマイクロソフトのストアからUbuntuなどをダウロードして使用することでCLIでLinuxを使えるようになります。

 

 このWSL2はDockerにも対応しているようなので用途がかなりひろくなっています。

 

 

  仮想化の種類

 

 仮想化の種類ですが、

  •   ホスト型                   
  •   ハイパーバイザー型  
  •   コンテナ型                
の3つがあります。ホスト型はOS上に仮想マシンを配置して運用する使用になっていますから、ホストOS上のソフトウェアのような形で指定したハードウェアの設定のマシンが動く仕様になっています。これは、QEMUやVirtual PCがそうした作りになっています。

 

 ハイパーバイザー型は、物理層の上にハイパーバイザーがあり、その上でVMが生成される作りになっていますから、ホスト型の問題点が解消された作りになっています。

 

 この方式は、XENやVirtual BoxやHyper-Vで採用されています。

 

 この2つは、PCを作ってOSを実装するものでしたが、これとは異なる方式の中にコンテナ型というものがあります。これは、Dockerなどがその方式を使用したものになりますが、異なる指定で動く機能のみを格納してそれを個別に動作するように運用できる仕組みがコンテナ型になります。

 

 アプリケーションを作る場合、必要なライブラリを用意してそれを参照してコードを書くことになりますが、標準ライブラリのように存在しない機能は自作するか、既に存在しているライブラリを使用することになります。当然、作成するアプリケーションが異なれば使用するライブラリも違ってきますから、必要なライブラリや条件によっては実行用のランタイム(実行環境)を用意して動かすことになります。

 

 こうしたことなるものを一つの端末で動かす場合、異なるライブラリやランタイムなどをすべてインストールしたり用意することになりますが、いろいろな物を詰め込むと時々競合関係にあっておかしな挙動になったり動かなくなることもあります。

 

 ただし、アプリケーション単体で見た場合にそうした問題が発生しない場合、競合するものを別の場所に分けて運用すればそうした問題に遭遇せずに済みます。この時に、ハイパーバイザー型の仮想化環境を用意してOS上で動かしてもいいのですが、もう少し簡素に動作させたほうがボトルネックも減るので、そうした条件で使用するのがコンテナ型になります。

 

 

  仮想化のを使う

 

 仮想化環境を作る場合、とにかくスレッド数が多いスペックの高いマシンを用意するとできることが増えるのですが、個人宅の中にブレードサーバを置くことは難しいですし、フレームを置くとフツーにブレーカーが落ちるのでそういったものは通常は導入できません。そのため、[ 1000スレッド以上の夢の環境 ] のようなのは無理ですが、現在のコンシューマ用のプロセッサでも16コアくらいはあるので、仮想化環境で自由なこうせいをつくることができます。

 

 この時に、最初に

  •   ホストPCのリソース                            
  •   WINDOWSアップデート                       
  •   セキュリティーソフトのアップデート  
  •   定期メンテナンス                                 

のようの仮想化の裏で発生しそうなものが雨後歌としても問題が内容に、ホスト側のコア数やメモリーの区画をある程度残るようにしておく必要がありますが、仮想化の場合、

 

コア数が足りていれば複数台のPCの同時稼働ができる

 

ので後負荷時のテストを行うことができます。例えば、16スレッドの中の8スレッドをホストで分けておいて、32GBの中の16GBをホストで使用するとします。そして、

  •   CPUコア数   : 1
  •   メモリー       : 2GB
  •   VRAM           : 128MB
  •   ストレージ    : 40GB

 

のPCを8台用意すると

  •   CPUコア数   : 8
  •   メモリー       : 16GB
  •   VRAM           : 1GB
  •   ストレージ    : 320GB

を消費することになるので、その分だけのストレージの区画に余裕があれば、PCの中で8台のPCに同時進行で異なる演算をさせることもできます。例えば、1台を集計係にして他の7台に整数の倍制度の数値の演算をしてもらうとします。この場合、足し算であった場合でも、一度の計算で16桁x7という結構な桁数の計算ができるのですが、この時に繰り上がりがある場合にはそのマシンの扱う桁数と紐づけしておいて集計用のマシンに送り、上の16桁が来た時に末尾に0か1を加算します。2つの数値の場合、加算の桁の繰上りは0か1なのでブール値で対応できますが、それを16桁単位の各マシンからくる数値を桁の順番に応じて処理をしていきます。これを1つのサイクルとして、膨大な数値を16文字を1つの配列に組み込んで、それを7回ループさせて、個別にマシンい送って数値をそうしんするようにすれば、加算に必要な処理は、これを複数の変数に対して行うだけで済みます。この読み込んだ後に、最終的に読み込んだ数値の次の値から同じように読み込むと次の112ケタを読み込むkとができますから、112桁単位での加算を一度に行う事が出来るようになります。

 

 この場合の、強要しているフォルダー内のファイルを使うとローカルファイル扱になるので、個別に参照して個別の計算ができるようになりますから、各PCの計算結果を16桁単位の配列として出力し、[ 数値, 繰上り ] のような形で配置しておくと、最初に、[ 対象の数値 ] + [ 繰上り ] を計算して結果を出してから所定の配列の位置に並べて、その後、同じ処理をしながら上の16桁を追加していくと膨大な数の加算がおこなえるようになります。これは桁数を減らして、繰上りを末尾と加算して配列に記述する補法でも同じことができますが、こうしたしょりを実装して動かすこともできます。

 

 これを行うと、ストレージへのランダムアクセスが頻繁に発生するので、どの程度の速度で処理が行えるのかの確認もできます。

 

 ちなみに、仮想化ではネットワークの設定もできるので、煩雑な作業にはなりますが、ネットワーク上でVMを使用することもできます。

 

 仮想化環境では、それに適合したイメージも配布されているので、インストール作業を行わずに環境構築だけで済むようになっているので、物理的に環境を構築するよりも短時間で規模の大きなもののベース部分を作ることができます。

 

 イメージについては、ハイパーバイザー型の仮想化だけでなく、コンテナ用のイメージなどもあるので、自作PCで環境を作るよりも作業負荷の少ない状態で環境のこうちくをすることができます。

 

 複数台のマシンを使ってテストをする場合、物理的な環境で試そうと思うと膨大な数のマシンにOSのインストールと環境の設定を行うことになりますが、仮想化環境の場合、クローンで同じ環境を複製できるので、環境構築の時間と労力を減らすことができます。といっても、ネットワークを使う場合に同じIPやNICだと問題があるので設定を変える必要がありますが、ハードウェアを大量に用意する条件よりも少ない作業量で同じ数のハードウェアを用意することができます。

 

 仮想化の場合、使用するPCの性能を上げておかないとVMの性能も低くなるので、ハイスペックなマシンを用意することになりますが、先ほどの8台のマシンをCore i7やRyzen7で構成した場合、3GHz以上で動作するPCが出来上がります。

 

 これをPentium 4やAthlon XPで行うと絶望的な消費電力になりますし、4台にしてCore 2 Duoで行ったとしても個人宅で使用するような電力とは思えないような数値になります。

 

 この条件と比較すると、GPUの負荷が少ない状態で動作憂さしているCre i7やRyzen 7辺りの消費電力はそれほど高くないので、実際の電力だと、PS5やXbox Series Xで重たいゲームをしているときよりも消費電力は少なくなると思います。

 

 これが、仮想化を使った時の消費電力の優位性になります。こうした処理をブレードサーバで必要なマシンスペックのものを用意して作るとブレードン数を減らして同じ処理ができるので、古いアーキテクチャから新しいアーキテクチャに入れ替えた時にランニングコストを抑えることができるわけです。

 

 こうした機能を現在では個人向けのPCでも試せるようになってます。たしか、ギガスクール用のPCもHyper-V対応なので、VMを作れた気がするのですが、OSの選択をしないと結構重たくなると思います。
 

 Hyper-Vが動くということは、WLS2も機能するはずなので、最新版のWINDOWS 10にアップデートすれば、WSL2の機能を使用することもできます。

 

 マシン的に絶望的に遅いわけではないけれど、WINDOWS10のサポートが終わると買い替えになりそうなPCの場合、Linuxへの旅路が待っていますから、最初に仮想化環境でLinuxを試してみて、理解を深めてからDualBootなどでLinuxをインストールするなどして使用する方法もありますが、この場合の仮想化環境はHyper-Vではなk、VirtualBoxやKVMなどになります。

 

 先ほど、バックグラウンドで計算をしている間に仕事をすれば、同時進行で作業をおこなえるのでワンオペでも有効に時間を使えると書きましたが、作業がLinuxでも大丈夫な場合だとBashなどを使って自動化を行うことができるので、Linux上で自動化をして作業を行っている間に、別の作業をホストPCで行うこともできます。

 

 現在は、Cドライブの割り当てがされているプライマリーのドライブは、SSDなので、先ほどのような仮想化でバンバン書き込みを行うと解けるような勢いでTBWの数値を消費していきますから、仮想化をする場合のVMの配置場所は壊れても交換がしやすい外付けのSSDなどで行うと安心してVMを動かすことができます。

 

 

  PCを使う場合

 

 PCを使う場合、OS上でアプリケーションを使って作業をすることになりますが、基本的な処理はローカルでの動作なので、基礎学習として、単一のPC上での作業や処理を学習することになります。これは、コーディングも同じですが、基本的な処理を逐次処理から学習し、手続き型の方法で回路図のように動作するもので動きを判断するようにしてから、挙動はどういった関連性と関係性から成り立っているのだろうか?ということを、人の物の関係性や処理そのものの流れなどをかんがえて、処理自体はどう言った物で構成されいて、それがどういた作りで成り立っているのかを考えることになります。この思考をする際にUMLを使うのですが、この時の処理を実装するときにクラス図から処理の構造を考えていくことになります。これあオブジェクト志向のプログラミングで使用するクラスを使ったコードの書き方になります。

 

 なので、関数を使った手続き型の構造とは少し違ってくるのですが、関数はサブルーチンの延長線上なのでC言語で使用する関数を使用した手続き型のコードの流れになりますから、これは、フローチャートで記述することができますが、クラスを使用した物をフローチャートで書こうとしても全く書けないはずなんですが、その理由は、設計図の作り方から違うためです。ちなみに、コードを書く際に使用するのがUMLになりますが、これが考案されたのが1997年あたりなので、それ以前のプログラミングの知識だけだとこの方法を学んでいないのでクラスの使い方などがわかりにくい場合があります。ちなみに、クラス図を作ってコードに変換するようなものも存在しているので、設計図を書くだけで、もれなく、メンバ変数、メンバ関数、インスタンスが生成されるという物凄い仕様の機能もあるようですから、仕組みと使い方を覚えるとコーディングがものすごく楽になります。

 

 このようにクラスの場合、コードを読み解くにはUMLのような設計図ありきの話になるので個人が自分だけで使うコードだとそれがなくても理解しているので問題はないのですが、通常はクラス図をベースに考えているはずなので、フローチャートベースの買い得方法をしようとすると難しいと思います。

 

 こうした機能も処理の実装部分は基礎ありきの話になるので、基礎ができた上での知識の拡張で対応するものになります。

 

 仮想化なども実機テストをする際にハードウェアを1台のPCで完結させるための選択肢だったり、別のアーキテクチャでの開発を単一のPCだけで行うための選択ですから基本となるのは単一のPCの単一のアーキテクチャでの作業になります。これは、ネットワークで動くアプリケーションも個別で見たときには単一のPCへの処理の実装でしかないので、基本となる単一のPCへの処理の実装を理解してから知識のかくちょうでたいおうするものになっています。