合計 昨日 今日

アバター
tana
 
記事: 33
登録日時: 2010年10月12日(火) 22:12
日記: 日記を見る (17)
日記
- 4月 2017
【ラズパイ】HPCクラスタ【その0】 (0)
   2017年4月08日(土) 10:58

+ 2月 2017
+ 3月 2012
+ 11月 2011
+ 10月 2011
+ 5月 2011
+ 11月 2010
+ 10月 2010
フォロー
カテゴリー
カテゴリに指定された日記はありません
フィード
次へ

【ラズパイ】HPCクラスタ【その0】

パーマリンクby tana on 2017年4月08日(土) 10:58

前回の日記書いてから業務多忙に陥りなんにもできてなかったですが、ようやく落ち着いたので。

そもそもHPCってなんぞという話がありますが、High Performance Computingの略、もっと簡単に言えばスパコンです。
スパコンと聞くとなんかすごそうなことやってると思うんですが、実際はそんなことありません。
最低2台コンピュータがあればそれっぽいことができます。あとLinuxのコマンドライン操作も知っておくとよいです。

個人的にやりたいことがあって、Raspberry Piでこんなことをやっていますが、
ある程度マシンスペックがあればVMWareとかVirtualBOXで仮想環境立ててやることもできます。

ちなみにラズパイクラスタで調べた中だと以下のリンク先が非常にわかりやすかったです。
HPCについても一通り必要なことが書かれているので勉強になりました。
http://www.cenav.org/raspi1/

ただし私は異端なので、ラズパイなのにRaspbianを使いませんし、GUIについても使いません。使いたくないのです(切実
なので次回以降の記事はHPCに興味があっても、Raspbian使いの人とかGUI操作じゃなきゃ嫌だぁ!って方には苦行以外の何物でもありません。
ただし、OS依存の部分とか適宜読み替えられればそうでもないとは思っています。

長いこと日記を書かなかったのでまとまりの無い内容に。。。
今後精進していくということで、お見逃し下さい(ノД`)・゜・。

コメント数: 0 閲覧数: 3615

RaspberryPiたのしい

パーマリンクby tana on 2017年2月20日(月) 21:46

何年かぶりに書き込んでみます。

最終履歴を見ると学生時代だったので年を食ったなぁと感じてます。。。

最近RaspberryPiを5個くらい手に居れたので
ひたすらOSイメージ書き込んで環境構築しています。

ひとしきり環境構築できたらクラスター組む予定ですが、
その先については無計画です。

いまやっている業務でPython使っているので、
クラスター用にWebインタフェース作ってみたいなと思っています。

また気が向いたらメモがてら書いていきたいです。

コメント数: 0 閲覧数: 4456

error MSB4014: 内部エラーのため、ビルドは予期せず停止しました。

パーマリンクby tana on 2012年3月28日(水) 23:59

以前からPC起動しての初回コンパイル、もしくは、しばらく別の作業してからコンパイルするとこのエラーが出てイライラしていました。
「error MSB4014: 内部エラーのため、ビルドは予期せず停止しました。」
なんやねんこれ!ってことで、今日はこの解決策を探すことに。

結論から言うと、以下のページで対応する修正プログラムをインストールすれば直るということがわかりました。
http://archive.msdn.microsoft.com/KB229 ... aseId=4955

さっそくやってみたところ、特に不具合なくどうさするようになりました。
また同じことがあった時用にメモ程度で残しておくことに。

コメント数: 0 閲覧数: 23343

VHDLテスト

パーマリンクby tana on 2011年11月10日(木) 00:56

コードにVHDLが対応していることを知ったので、確認がてらテスト。
ちなみに適当に書くんで動作は保障しません。

コード[VHDL]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
--------------------------------------------------
-----Library
--------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
 
--------------------------------------------------
-----Entity
--------------------------------------------------
entity ADCtrl is
    generic(    ADCBIT : integer := 11;
        ROMBIT : integer := 20;
        ADRSBIT : integer := 10;
        DATABIT : integer := 16);
    port(   CLK,RST : in std_logic;
        ADC_START : in std_logic;
        ADC_SEL : out std_logic;
        SAMPLING : in std_logic_vector(ADCBIT-1 downto 0);
        ADC_ADRS : out std_logic_vector(ADRSBIT-1 downto 0);
        ADC_DATA : out std_logic_vector(DATABIT-1 downto 0));
end entity;
 
--------------------------------------------------
-----Architecture
--------------------------------------------------
architecture RTL of ADCtrl is
 
    --------------------------------------------------
    -----Signal
    --------------------------------------------------
    signal count_half : unsigned(ADRSBIT-2 downto 0);
    signal count_fs : unsigned(ADRSBIT-1 downto 0);
    signal trig_delay1 : std_logic;
    signal trig_delay2 : std_logic;
    signal trig_delay3 : std_logic;
    signal trig_edge : std_logic;
 
begin
 
    Trig_Delay : process(CLK,RST)
    begin
        if(RST = '0')then
            trig_delay1 <= '0';
            trig_delay2 <= '0';
            trig_delay3 <= '0';
        elsif(CLK'event and CLK = '1')then
            trig_delay1 <= ADC_START;
            trig_delay2 <= trig_delay1;
            trig_delay3 <= trig_delay2;
        end if;
    end process;
   
    trig_edge <= trig_delay1 and not trig_delay2;
   
    Count_Half_Gen : process(CLK,RST)
    begin
        if(RST = '0')then
            count_half <= (others => '0');
        elsif(CLK'event and CLK = '1')then
            count_half <= count_half + 1;
        end if;
    end process;
   
    Count_Fs_Gen : process(CLK,RST)
    begin
        if(RST = '0')then
            count_fs <= (others => '0');
        elsif(CLK'event and CLK = '1')then
            if(trig_edge = '1')then
                count_fs <= (others => '0');
            elsif(count_fs /= 1023 and count_half = 511)then
                count_fs <= count_fs + 1;
            end if;
        end if;
    end process;
   
    process(count_fs)
    begin
        for i in ADRSBIT-1 downto 0 loop
            ADC_ADRS(ADRSBIT-1-i) <= count_fs(i);
        end loop;
    end process;
   
    Cap_Sel_Gen : process(CLK,RST)
    begin
        if(RST = '0')then
            ADC_SEL <= '0';
        elsif(CLK'event and CLK = '1')then
            if(trig_edge = '1')then
                ADC_SEL <= '1';
            elsif(count_fs = 1023 and count_half = 511)then
                ADC_SEL <= '0';
            end if;
        end if;
    end process;
           
    --------------------------------------------------
    -----Data to Ram Controller
    --------------------------------------------------
    ADC_DATA <= "00000" & SAMPLING;
 
end RTL;


プレビューを見る限り、いい感じ。
これは使える!

コメント数: 0 閲覧数: 23427

RS-232C

パーマリンクby tana on 2011年11月09日(水) 01:00

先に断っておきます。
自分はゲームプログラミングとは全く関係ないことをやっています!
専門はハード屋さんですから!

今はハードウェアと通信を行い、データのサンプリング、変換までをHWで行い、結果をPCに送るというシンプルな制御ソフトを作っています。
んで、そのためにRS-232Cを使ったシリアル通信を行っています。
ポートオープンからクローズまで、ユーザーが想定外の操作をできないよう、ありとあらゆる誤操作の要因を潰せたのはよかったのですが、
そこでまったく予想していなかったバグに遭遇。

ポートオープンが成功しない。
ポートオープンしてから、HW側に制御信号を送信し、HWからの応答を受け取って初めてポートオープン成功と判断するように
プログラムを組んだはずが、なぜかHWに制御信号が届いていないという事態に。
C++を触るのは久しぶりかつほぼ初心者なので、出来る限りシンプルに作ったはずが、なぜか動かない。
HW側のバグかとも思い検証するも、それらしき箇所は見当たらない。
で、いよいよ面倒になったので、ターミナルソフトを使っての検証を行うと、こちらは上手くいく。
そうなると結局は制御プログラムが間違ってるという結論に至る。
また厄介なことに、ターミナルソフトを使った後ならなぜかポートオープンが成功するという罠。

で、原因をとことん検証した結果、以下のポートオープン関数に問題がありました。

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
bool ComPortCtrl::ComPortOpen(LPCTSTR portNum, int brs)
{
    if (portNum==NULL)
        return false;
 
    //
    //シリアル通信設定
    //
    dcb.DCBlength = sizeof(DCB);    //DCB構造体の長さ
 
    //ポートの取得
    hPort = CreateFile(portNum,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
 
    if(hPort == INVALID_HANDLE_VALUE){
        return false;
    }
 
    //バッファの設定
    if(!SetupComm(hPort,BUFFSIZE,BUFFSIZE))
        return false;
 
    GetCommState(hPort,&dcb);
 
    //通信条件設定
    dcb.BaudRate = brs;     //伝送速度
    dcb.fBinary = true;     //バイナリモード
    dcb.ByteSize = COMBITSIZE;      //データサイズ
    dcb.fParity = NOPARITY; //パリティの有無
    dcb.StopBits = ONESTOPBIT;  //ストップビット数
 
    //ハードウェアフロー制御
    dcb.fOutxCtsFlow = false;       //CTSハードウェアフロー制御
    dcb.fOutxDsrFlow = false;       //DSRハードウェアフロー制御
    dcb.fDtrControl = DTR_CONTROL_DISABLE;      //DTR制御
    dcb.fRtsControl = RTS_CONTROL_DISABLE;      //RTS制御
 
    //ソフトウェアフロー制御
    dcb.fOutX = false;
    dcb.fInX = false;
    dcb.fTXContinueOnXoff = true;
    dcb.XonLim = 512;
    dcb.XoffLim = 512;
    dcb.XonChar = 0x11;
    dcb.XoffChar = 0x13;
 
    //Others
    dcb.fNull = true;
    dcb.fAbortOnError = true;
    dcb.fErrorChar = false;
    dcb.ErrorChar = 0x00;
    dcb.EofChar = 0x03;
    dcb.EvtChar = 0x02;
 
    //タイムアウト時間設定
    timeout.ReadIntervalTimeout = 500;  //タイムアウト時間:500msec
    timeout.ReadTotalTimeoutMultiplier = 0; //一文字辺りの読込み時間
    timeout.ReadTotalTimeoutConstant = 500; //エラー検出用タイムアウト時間:500msec
 
    timeout.WriteTotalTimeoutMultiplier = 0;    //一文字辺りの書込み時間
    timeout.WriteTotalTimeoutConstant = 500;    //エラー検出用タイムアウト時間:500msec
 
    if(!SetCommTimeouts(hPort,&timeout))
        return false;
 
    if(!PurgeComm(hPort,PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR))
        return false;
 
    return true;
}


実はとても初歩的なミスをしていて、<<//タイムアウト時間設定>>というコメントの上に
コード[C++]: 全て選択
1
2
if(!SetCommState(hPort,&dcb))
return false;

を書いておかなければいけなかったんです。
厳密に言えば、SetCommState()処理ですね。
これやらないと、通信速度とかの諸々の設定が反映されないという。

このバグのために丸二日を費やしてしまったことを反省せねばなりません。
ターミナルソフトで通信できた後なら、ターミナルの設定が反映された後なんで動くわけです。
実はいよいよ今日やっていてダメだったら、こちらの掲示板で聞くつもりでした。
こんな下らないミスを指摘されていたら恥ずかしくて悶え死んでいましたねww


HWとSWの両方を自作するとなると色々問題が出てくるので、なにが原因なのか突き止めるのが大変なんですが、
後の自分のために、こんなこともあるよという経験を日記にして残しておきたいと思います。以上!

コメント数: 0 閲覧数: 23413

オンラインデータ

登録ユーザー: なし