3
3

新たな計算の形。 48ビット(6バイト)のメモリを持つ256基の計算機群。そのメモリ状態を視覚化するゲームです。

Last updated at Posted at 2024-08-24

ショートストーリー: 「48ビットの計算機群の物語」


東京の夜景が一面に広がるオフィスビルの中、山田亮介はコンピュータの前に座っていた。彼は東京の一流ソフトウェア開発会社で働くプログラマで、最近は最先端の並列計算システムに取り組んでいた。

今日の彼の目標は、16ビットの数値を加算する並列計算機群をシミュレーションし、そのメモリ状態を視覚化することだった。彼の画面には、16×16の計算機群が表示され、各計算機が16ビットのランダムな数値の加算を行っている。ビットごとに色が異なり、結果がどのように変化するかが一目でわかるように設計されていた。

「このプロジェクトが成功すれば、並列計算の理解が大きく進む。」山田は自分に言い聞かせるように呟いた。彼は慎重にプログラムを調整し、計算機群が正確に動作するようにしていた。

プログラムが実行されると、16×16の計算機群がリアルタイムで色を変えながら動き出した。各計算機は、16ビットのランダムな数値を生成し、それを加算して結果を48ビットで出力していた。つまり16ビットの2つの入力数値と16ビットで表される計算結果の合計48ビットだ。ビットが1なら赤、0なら黒で表示され、計算結果が美しいパターンとしてスクリーンに現れていた。

山田はその光景を見ながら深く感心した。計算機群が同時に働き、それぞれのビットが色として表現される様子は、まるでデジタルの芸術作品のようだった。各ビットの色が組み合わさって、計算結果が鮮やかに浮かび上がってくる。その美しさは、彼の努力が結実した証だった。

「48ビットの計算機群が、こうして視覚化されると、本当に壮観だ。」山田は微笑んだ。彼はその画面に映る計算結果が、並列処理の力を感じさせるものだと実感した。計算機群が一つ一つのビットを表現し、全体として計算結果を描き出すその様子は、彼にとって大きな達成感をもたらしていた。

夜が更ける中、山田はその美しい計算結果を眺めながら、次のプロジェクトに向けたアイデアを練り始めた。彼の目には、48ビットの計算機群が織りなすデジタルの宇宙が、未来の可能性を広げているように映っていた。彼は、自分の技術がさらに進化し、新たな挑戦を迎える日を楽しみにしていた。


このショートストーリーは、48ビットの並列計算機群が計算を行い、その結果を視覚化する過程を描いています。

スクリーンショット 2024-08-25 054013.png

スクリーンショット 2024-08-25 054027.png

新たな計算の形。 48ビット(6バイト)のメモリを持つ 16*16 256基の計算機群。

コードをメモ帳などのテキストエディタに貼り付け、ファイルを「index.html」などの拡張子が.htmlのファイルとして保存します。その後、保存したファイルをブラウザで開けば、コードが実行されます。

説明

16ビットのランダムな数値生成:
generateRandom16Bit関数で16ビットのランダムな2つの数値を生成しています。

足し算の結果を16ビットとし、結果を色として表示します。

これで、48ビットのメモリ状態を持つシミュレーションが、16ビットのランダムな足し算を行う3D表示が可能になります。

16×16×48 の3Dグリッドの配置:
three.js ライブラリを使用して、16×16×48 の直方体(キューブ)を作成し、シーンに配置します。

カラフルなメモリ状態の表示:
ビットが1の場合は赤、0の場合は黒にします。

アニメーション:
animate 関数が呼び出され、各フレームごとにキューブの色が更新され、シーンが再レンダリングされます。

これで、16基×16基×48ビット の並列計算機が3Dでプロップされ、メモリ状態がカラフルに表示されます。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>3D Bit Calculator Visualization (48-bit Memory)</title>
    <style>
        body { margin: 0; overflow: hidden; }
        canvas { display: block; }
    </style>
</head>
<body>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
    <script>
        const gridSize = 16;
        const depth = 48; // 48ビットの深さ
        const boxSize = 1; // ボックスサイズを調整
        const gap = 2; // グリッド間のスペース

        // シーン、カメラ、レンダラーの作成
        const scene = new THREE.Scene();
        const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
        const renderer = new THREE.WebGLRenderer();
        renderer.setSize(window.innerWidth, window.innerHeight);
        document.body.appendChild(renderer.domElement);

        // カメラを計算機群に近づける
        camera.position.set(gridSize * 2, gridSize * 2, depth * 2);
        camera.lookAt(0, 0, 0);

        const allCubes = [];

        function createGrid(offsetX, offsetY) {
            const cubes = [];

            // 16×16×48の計算機群を作成
            for (let x = 0; x < gridSize; x++) {
                for (let y = 0; y < gridSize; y++) {
                    for (let z = 0; z < depth; z++) {
                        const geometry = new THREE.BoxGeometry(boxSize, boxSize, boxSize);
                        const material = new THREE.MeshBasicMaterial({ color: 0x000000 }); // 初期色は黒
                        const cube = new THREE.Mesh(geometry, material);
                        cube.position.set(x + offsetX, y + offsetY, z);
                        scene.add(cube);
                        cubes.push(cube);
                    }
                }
            }

            allCubes.push(cubes);
        }

        // 1つのグリッドを描画
        createGrid(0, 0);

        function generateRandom48Bit() {
            return Math.floor(Math.random() * Math.pow(2, 48)); // 48ビットのランダムな数値
        }

        function updateCubes() {
            for (let cubes of allCubes) {
                for (let cube of cubes) {
                    const state = generateRandom48Bit();

                    // 各ビットを取り出し色を設定
                    const x = Math.floor(cube.position.x);
                    const y = Math.floor(cube.position.y);
                    const z = Math.floor(cube.position.z);

                    const bitIndex = x + y * gridSize + z * gridSize * gridSize;
                    const bitValue = (state >> bitIndex) & 1;

                    // ビットが1の場合は赤、0の場合は黒
                    const color = bitValue ? 0xff0000 : 0x000000; // 赤または黒
                    cube.material.color.set(color);
                }
            }
        }

        function animate() {
            requestAnimationFrame(animate);
            updateCubes();
            renderer.render(scene, camera);
        }

        // ウィンドウサイズ変更時にレンダラーとカメラのサイズを調整
        window.addEventListener('resize', () => {
            const width = window.innerWidth;
            const height = window.innerHeight;
            renderer.setSize(width, height);
            camera.aspect = width / height;
            camera.updateProjectionMatrix();
        });

        animate();
    </script>
</body>
</html>

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3