仮眠プログラマーのつぶやき

自分がプログラムやっていて、思いついたことをつぶやいていきます。 2025年からzennに移行

自作ゲームやツール、ソースなどを公開しております。
①ポンコツ自動車シュライシュラー
DOWNLOAD
②流体力学ソース付き
汚いほうDOWNLOAD
綺麗なほうDOWNLOAD
③ミニスタヲズ
DOWNLOAD
④地下鉄でGO
DOWNLOAD
⑤ババドン
DOWNLOAD
⑥圧縮拳(ツール)
DOWNLOAD
⑦複写拳
DOWNLOAD
⑧布シミュレーション
DOWNLOAD
⑨minecraft巨大電卓地形データ
DOWNLOAD
⑩フリュードランダー
デジゲー博頒布α版
DOWNLOAD
⑪パズドラルート解析GPGPU版
DOWNLOAD
⑫ゲーム「流体de月面着陸」
DOWNLOAD

2018年04月

BIOSでフリーズの原因がHDDのexfatフォーマット形式のせいだった

新規ハードディスク購入で深い沼にはまったので、記事にしてみようと思う。


今回8T HDDの値段がこなれて来たのでST8000DM004を中古(18000円前後)で購入した。
メインのwin10のPCにつないでデータバックアップ用として使用してみることとした。
書き込み読み込みも100MB/s超えており、最近のHDDはすごいなぁと思いつつ5TBくらいのデータ群を書き込んだ。特に異音もなく動いているし、割と最近のモデルなので中古だけどすぐには壊れないだろうとたかをくくっていた・・・

そしてある日、「なんだかパソコンが重いな」といって再起動をかけたところ

BIOS画面から動かない。

電源ボタンで強制終了してからまたつけてもBIOS設定画面すら開かない。ASUSのロゴがでてなにも受け付けない
まさかパソコン壊れた・・?
もう5年以上にもなるし常にBOINCやらマイニングやらで24時間フル稼働させていたからいつどこがどうなってもおかしくないと思っていた。
マザボはP9X79で、これにはcpuやメモリ、グラボに異常がある場合に知らせてくれるLEDランプがついている。今回はPCI Express x16スロットの横にあるBOOT DEVIDE LEDが点灯状態だった。

ははーんグラボだな、と思ってグラボを変えてみたけど変化なし。今度は電源を疑う。グラボに給電する電力が足りないのだろうと。外部電源を必要としないAMD HD7750にしてもやはり変わらず。
PCI Express x16の給電が足りないのだろうとやはりしつこく電源を疑う。ちなみに他の原因を考えたがそもそもOS画面に行く前なのでOSは関係なし。メモリの異常ならばマザボのDRAM_LEDが点灯しないのはおかしい。CPUの異常でも同じくCPU_LEDが点灯してないのはおかしい。
あとはマザボ自体の異常。電池切れとか。
いろいろ外しながらやっているうちに、OSの入ったSSD以外のドライブを外したところで起動した。そして原因特定。一番最近つけたST8000DM004だ。

それも再現率100%で、このHDDつけたときだけBIOSが起動しない。HDDのせいでBIOSすら起動しないことあるの?普通に考えたらHDDの故障・・
これは考えたくない・・大事なデータがいっぱいはいってるんだ(大事じゃないのも多いけど)

それでググってみるけどやっぱりHDDの故障が一番考えられそうだった。

ただちゃんと電源投入時にHDDも回っている音がするので完全に死んだわけではなさそう。
諦めきれずに数千円のSATA - USB3.0変換ケーブルを購入して、USB経由でデータ救出を試みた。結果はまさかの、BIOSでフリーズ。USB経由でもフリーズとか怖すぎる。しかも今度はHDD回ってる音しないし。

心折れかけたけど、別のPCに、USB経由でなくマザボからしっかり(?)つないでみたところ・・
OS起動!
しかも中のデータは全部完全に生きていた!!!!!

結局データは全部取り出せて、今でもこの8TBのHDDは問題なく稼働している。



今回のをまとめると
メイン機
マザボ:P9X79
CPU:core i7 3820
メモリ:PC3-12800(DDR-1600) 8GB*4 クアッドチャネル
グラボ:RX 480+HD 7970
OS:windows 10 pro 64bit
SATAデバイス:Crucial_CT525MX300SSD1(SSD OS用)、M4-CT128M4SSD2(SSD データ用)、ST4000DM004(HDD データ用)、ST8000DM004(HDD データ用)

で再現率100%でBIOS画面のフリーズ。ST8000DM004なしの構成だと問題なく起動。


サブ機
マザボ:ASROCK H270M-ITX/ac
CPU:core i7 7100T
メモリ:DDR4?? 8GB 1枚
グラボ:なし
OS:ubuntu 16.04 LTS

こちらにつないで救出できた。
どうも調べてみると3TBのHDDをexFATで初期化するとBIOS起動しないなどちらほら情報がでてくる。
https://likemid.wordpress.com/2014/03/24/exfat-over-2tb-hdd-bios-freeze/

上の記事を参考にすると「exfatで2TB以上のパーティションをフォーマットしたため、再起動時にBIOSがブート先を探しにいけなかった」という結論のようです。でもって多分だけど、マザーボードによっては問題なく起動できると。
あーHDDの故障じゃなくてよかった。

なお今回exfat形式でのフォーマットはWindows10で行っている。フォーマットしておいて再起動時にマザボが対応してませんとかなんて罠・・

これからはデータ用でもNTFSでフォーマットすることにした。

PyOpneCLでデバイス情報取得

今度はデバイス情報取得
公開されているPyOpenCLサンプルを改変
# -*- coding: utf-8 -*-
# OpenCLで使用できるデバイスを列挙して、デバイス情報を取得&表示
import pyopencl as cl
from pyopencl import device_type
from pyopencl import device_local_mem_type


for platform in cl.get_platforms():
    for device in platform.get_devices():
        print('''
        PLATFORM                 = {}
        VENDOR                   = {}
        Name                     = {}
        Type                     = {}
        OPENCL_C_VERSION         = {}
        GLOBAL_MEM_SIZE          = {}
        Max Compute Units        = {}
        Max Work Group Size      = {}
        Max Work Item Dimensions = {}
        Max Work Item Size       = {}
        Local Mem Size           = {}
        Local Mem Type           = {}
        '''.format(
            device.platform,
            device.vendor,
            device.name,
            device_type.to_string(device.type),
            device.opencl_c_version,
            device.global_mem_size,
            device.max_compute_units,
            device.max_work_group_size,
            device.max_work_item_dimensions,
            device.max_work_item_sizes,
            device.local_mem_size,
            device_local_mem_type.to_string(device.local_mem_type)
        ))


自分の環境では

PC1
構成 CPU:core i7 3820、GPU:HD 7970、RX 480

認識プラットフォーム1つ
認識デバイスは3つ(上記3つ)

PC2
構成 CPU:core i7 4710MQ、GPU:intel(R) HD Graphics 4600、GTX 860M

認識プラットフォーム2つ
認識デバイスはプラットフォーム1でcore i7 4710MQとintel(R) HD Graphics 4600
プラットフォーム2でGTX 860Mを認識した。



環境によっては同じデバイスを複数のプラットフォームから認識される可能性もあると思う

PyOpenCLで1+1の計算

多分これがPyOpneCLで計算する一番最小構成
# -*- coding: utf-8 -*-
import numpy as np
import pyopencl as cl

ctx = cl.create_some_context()
queue = cl.CommandQueue(ctx)

cl_mem_a=cl.Buffer(ctx,cl.mem_flags.READ_WRITE,4)
cl_mem_b=cl.Buffer(ctx,cl.mem_flags.READ_WRITE,4)
cl_mem_c=cl.Buffer(ctx,cl.mem_flags.READ_WRITE,4)
a = np.array([1])
b = np.array([1])
c = np.empty(1, dtype = np.int32)

cl.enqueue_write_buffer(queue,mem=cl_mem_a,hostbuf=a)
cl.enqueue_write_buffer(queue,mem=cl_mem_b,hostbuf=b)

global_work_size=(1,1)
local_work_size=(1,1)

prg_string="""
__kernel void Onlyadd(__global int* A,__global int* B,__global int* C)
{
   C[0] = A[0] + B[0] ;
}
"""
program=cl.Program(ctx,prg_string).build()
kernel_Onlyadd=cl.Kernel(program,"Onlyadd")
kernel_Onlyadd.set_arg(0,cl_mem_a)
kernel_Onlyadd.set_arg(1,cl_mem_b)
kernel_Onlyadd.set_arg(2,cl_mem_c)

cl.enqueue_nd_range_kernel(queue,kernel_Onlyadd,global_work_size,local_work_size)
cl.enqueue_read_buffer(queue,mem=cl_mem_c,hostbuf=c)
print(c)


デバイス(GPU等)上に要素1の配列でA,B,Cを確保。
C=A+B
をやってホストに結果を戻して表示

PyOpenCLでHellow World

PyOpenCLはじめました
python 3でnumpy、PyOpenCLのインストールが最低必要

# -*- coding: utf-8 -*-
import numpy as np
import pyopencl as cl

ctx = cl.create_some_context()
queue = cl.CommandQueue(ctx)
data_mem=cl.Buffer(ctx,cl.mem_flags.READ_WRITE,32)
hostdata=np.empty(32, dtype = np.int8)
global_work_size=(1,1)
local_work_size=(1,1)

prg_string="""
__kernel void hello(__global char* string)
{
   string[0] = 'H';
   string[1] = 'e';
   string[2] = 'l';
   string[3] = 'l';
   string[4] = 'o';
   string[5] = ',';
   string[6] = ' ';
   string[7] = 'W';
   string[8] = 'o';
   string[9] = 'r';
   string[10] = 'l';
   string[11] = 'd';
   string[12] = '!';
}
"""
program=cl.Program(ctx,prg_string).build()
kernel_h=cl.Kernel(program,"hello")
kernel_h.set_arg(0,data_mem)
cl.enqueue_nd_range_kernel(queue,kernel_h,global_work_size,local_work_size)
cl.enqueue_read_buffer(queue,mem=data_mem,hostbuf=hostdata)
res_string=""
for i in range(len(hostdata)):
    res_string=res_string+(chr(hostdata[i]))
print(res_string)

はい
長過ぎる笑
むりくりOpenCLで文字列扱ってるから逆に難しくなってしまった
多分1+1=2の計算をやるほうが簡単
プロフィール

toropippi

記事検索
アクセスカウンター

    QRコード
    QRコード
    • ライブドアブログ