約 3,883,365 件
https://w.atwiki.jp/dayzresistance/pages/8.html
RSSを取り込んで一覧表示(showrss) #showrss(ここにRSSのURL) もしくは #rss(ここにRSSのURLを入力) と入力することで指定したRSSを取り込んで一覧表示します。 詳しくはこちらをご覧ください。 =>http //www1.atwiki.jp/guide/pages/266.html#id_b6d0b10d たとえば、#showrss(http //iphone.appinfo.jp/rss/pricedown/,target=blank,countrss,lasttime) と入力すると以下のように表示されます。 showrss プラグインエラー RSSが見つからないか、接続エラーです。
https://w.atwiki.jp/live2ch/pages/195.html
トップ 動画カテゴリ概要 ゲームを録画する方法 Dxtoryの使い方 / 2012年07月25日 (水) 19時57分52秒 PCゲームを録画できる、ほかのアプリについてはPCゲームの録画をご覧ください。 Dxtory(デクストリィ)は、PCゲームを録画するための専用のソフトウェア(キャプチャーソフト)です。おもに3DグラフィックスのPCゲームをフルスクリーンモードで録画したいときによく使われるのがDxtoryです。Dxtoryは定番のキャプチャーソフトのひとつといってよいでしょう。 Dxtoryの特長として、Windows Vista/7/8ならば特別な設定をせずにゲーム音を録音できる点、および2系統同時録音という機能を利用してゲーム音とマイクを独立して同時録音できる点をあげることができます。2系統同時録音は実況プレイ動画を作成する場合に重宝します。また、Dxtoryでは動画を複数のHDDに分散して書き込むことも可能です。 なお、Dxtoryはデスクトップ画面を録画するためのソフトウェアではありません。デスクトップ画面を録画したいという場合は、Bandicamやロイロ ゲーム レコーダーなどを使用しましょう。また、Dxtoryは試用版であるかぎり録画ファイルにロゴが表示されます。 ダウンロード料金 録画ファイルのロゴ表示 録画の時間制限 Dxtory終了後のサイト表示 試用版 無料 あり なし あり ライセンス購入後 なし なし 目次 ダウンロード / インストール キャプチャーの成否について Dxtoryの簡単な使い方 各タブについて 「ターゲット」タブ 「オーバーレイ」タブ 「フォルダ」タブ 「ホットキー」タブ 「ムービー」タブビデオコーデック フレームレート 出力 オプション スケーリング 「オーディオ」タブ音声の録音 ゲーム音のみを録音したい場合 ゲーム音+マイク入力を録音したい場合 「スクリーンショット」タブ 「アドバンス」タブ 2系統同時録音意義 注意点 2系統同時録音の簡単な使い方 関連ページ ダウンロード / インストール Dxtoryは公式サイトのダウンロードページでダウンロードします。「DxtorySetup○○○.exe」をダウンロードしたら、これを起動してインストールしましょう。Dxtoryのインストール完了後、Dxtoryを起動します。 もしDxtoryを起動できない場合は、.NET Framework 4.0(ランタイム)をインストールしてください。ただ、通常はほとんどのPCに同ランタイムがインストールされているので、Dxtoryの起動は問題なく行えるはずです。 ▲画面の上へ キャプチャーの成否について PCゲームの録画でも書きましたが、DxtoryですべてのPCゲームを録画できるわけではありません。PCゲームの仕様により録画できない場合があります。 まず、録画できるのは基本的に3DグラフィックスのPCゲームと考えてください。2Dグラフィックスの紙芝居型ゲームの場合はたいてい録画できません。また、3DグラフィックスのPCゲームであっても、プロテクトがかかっているゲームも同様に録画できません。録画できるかどうかを実際に試して確認する必要があります。 具体的には、Dxtory→PCゲームの順に起動して、ゲーム画面の左上に緑色の数字が表示されていれば、そのPCゲームはDxtoryでキャプチャーすることが可能ということです。Dxtoryで録画できない場合は、アマレココやBandicamなどを使用してください。 ▲画面の上へ Dxtoryの簡単な使い方 では、さっそくDxtoryを使用してみましょう。簡単な使い方は以下のとおりです。マイクの録音についてはあとで詳述するため省きます。 Dxtoryを起動します。念のためDxtoryをPCゲームよりも先に起動しましょう。Dxtoryが録画対象のゲームをターゲットとして認識しやすくなります。 Dxtoryが試用版であるとのメッセージが表示されます。「試用版を体験」をクリックします。 PCゲームを起動します。 ゲーム画面左上に緑色の数字が表示されていることを確認します。 「フォルダ」タブで動画の保存場所を設定します。ここで設定した場所に録画ファイルが作成されます(*1)。 「ムービー」タブで「フレームレート」を30fpsにし、「スケーリング」を50%にします。スケーリングは、PCスペックに自信がある場合は100%でかまいません。 「オーディオ」タブで、「オーディオデバイス」にある「デバイス」を「スピーカー」にします。Windows Vista/7/8の場合はこれでゲーム音を録音できます。 キーボードの「F12」を押すと録画を開始します。録画中は緑色の数字がオレンジ色で表示されます。 録画を停止する場合は、再度「F12」を押します。 さきほど設定した場所に動画ファイルがあるので、再生して動画を確認しましょう。 動画はAVIというファイル形式になっています。AVI形式はWindows標準の動画ファイル形式なので覚えておきましょう。AVI2.0の動画は、HDDのフォーマット形式がFAT32とよばれるものだと4GBまでしか録画できません。 FAT32 NTFS 説明 AVI1.0 2GB AVI2.0 4GB 2TB Dxtoryで録画するとAVI2.0になる。PC内蔵のHDDはNTFS。 ▲画面の上へ 各タブについて ここからはDxtoryでの設定について詳しく見ていきます。Dxtoryにはいろいろなタブがありますが、とくに重要なのは「ムービー」タブと「オーディオ」タブです。なぜなら、両タブにおいて動画の品質や音声の録音についての設定をするからです。 タブ名 設定内容 重要度 「ターゲット」タブ キャプチャー対象の情報について B 「オーバーレイ」タブ ゲーム画面に表示する情報について B 「フォルダ」タブ 動画やスクリーンショットの保存について B 「ホットキー」タブ ホットキーについて B 「ムービー」タブ 録画について A 「オーディオ」タブ 録音について A 「スクリーンショット」タブ スクリーンショットについて B 「アドバンス」タブ 細かい設定について B 「グローバル」タブ - C 「インフォメーション」タブ - C ▲画面の上へ 「ターゲット」タブ 「ターゲット」タブの「プロファイル」では、録画対象であるPCゲームについてのプロファイル編集ができます。また、「無視設定」で録画対象にしたくないPCゲームを設定することも可能です。よくわからない場合はこれらの設定を気にする必要はありません。 「ターゲット情報」には録画できるPCゲームの情報が表示されます(PCゲーム起動後)。 ▲画面の上へ 「オーバーレイ」タブ 「オーバーレイ」タブでは、ゲーム画面に表示される情報についての設定をします。ここでの情報を見ることによって、たとえば意図したとおりの滑らかな動きの動画になっているかどうかということを録画中に確認できます。 「ビデオFPS」は、録画対象であるPCゲームの動きの滑らかさを表しています。環境・状態によって数値が変動しますが、基本的に30fps以上あれば問題ありません。60fps前後であるときは、かなり滑らかにPCゲームが動作している状態です。ビデオFPSは録画していないときは緑色、録画中はオレンジ色で表示されます。 「ファイル書き込みFPS」は、録画ファイルにおける動きの滑らかさを表しています。録画中は後述する「ムービー」タブの「フレームレート」と一致しているのが理想です。録画中に両者の値が一致していない場合は、PCスペックがたりていないということです(*2)。その場合はDxtoryでの設定を見直す必要があるでしょう(後述)。 「ビデオFPS」と「ファイル書き込みFPS」の表示位置は変更可能です。「オーバーレイ」タブ内の右下の画像で、任意の箇所をクリックして表示位置を決めてください。これらの情報は録画されることはありませんが、画像中央をクリックすることで非表示にすることもできます。 ▲画面の上へ 「フォルダ」タブ 「フォルダ」タブでは、動画およびスクリーンショットの保存場所を設定します。をクリックすると動画の保存場所を設定できます。 をクリックして「実行」を選択するとHDDの書き込み速度を計測できます。 ▲画面の上へ 「ホットキー」タブ 「ホットキー」タブでは、ホットキー(ショートカットキー)についての設定を変更できます。「Ctrl / Shift / Alt」キーと任意のキーを組み合わせることも可能です。 ▲画面の上へ 「ムービー」タブ ビデオコーデック 録画品質を変更したい場合や、ファイルサイズを小さく抑えたい場合は、「コーデック」で「Dxtory Video Codec」を選択して、隣りにあるをクリックしてください。そして、「フォーマット」で任意のものを選択します。 「RGB - 最高品質」は高画質ですが、場合によっては1分間の録画でファイルサイズが4GBを超えます。また、HDDの書き込み速度が遅い環境である場合、映像がカクカクします。ファイルサイズを小さくしたい場合は、「YUV420(2x2) - 中品質」または「YUV410(4x4) - 低品質」でもかまいません。ただし画質は落ちます。 ほかにもファイルサイズを小さくする方法として、「オプション」で「圧縮」にチェックを入れるという手があります。ただし、「圧縮」にチェックを入れていない場合と比較してCPU使用率が上昇します。CPU使用率が上昇すると、場合によってはPCが重くなり、映像がカクカクするかもしれません。PCのスペックに応じて設定しましょう。 フレームレート 「フレームレート」は、録画ファイルにおける動きの滑らかさの設定です。通常は30fpsにしておけば十分です。PCゲームが60fpsで動作しているならば60fpsでもかまいません(*3)。そのほうが動きの滑らかな動画を作成できます。ただ、録画中にPCの動作が重くなって映像がカクカクするというような場合はフレームレートを下げましょう。 出力 「ファイル出力」はそのままの意味です。動画ファイルをHDDに保存するということです。録画する場合は、つねに「ファイル出力」をONにしておきましょう。 「DirectShow出力」はOFFにしておきます。これは、フルスクリーンモードでPCゲームをプレイしながらニコニコ生放送などのライブ配信を行える機能です。フルスクリーンというところがポイントですが、通常は使用しません。 「ファイルフォーマット」も「AVI」のままにしておきます。AVIというのはWindows標準の動画ファイル形式です。動画関連で頻出の用語なので覚えておきましょう。「RawCap」は複数のHDDに動画を保存する場合に選択します。 オプション 「ビデオFPS同期」をONにしている場合、録画中のPCゲームのフレームレートが「フレームレート」で設定した値に制限されます。たとえば、「フレームレート」を30fpsに設定した状態で「ビデオFPS同期」をONにしていたとします。このとき、かりに60fpsでPCゲームが動いていても、録画中はゲームも30fpsに制限されるということです。 「ビデオFPS同期」をONにするかOFFにするかは人それぞれですが、FPSやTPSなどのシューティングゲームをプレイしている人であれば通常はOFFがよいでしょう。そのほうが違和感なくプレイできるからです。 スケーリング 「スケーリング」というのは、録画ファイルの画面サイズを小さくすることをいいます。スケーリングすることによりCPU使用率を下げ、かつファイルサイズを小さくすることができます。画質は劣化しますが、PCの負担を軽減することができるメリットがあります。PCのスペックに余裕がない場合は、スケーリングをうまく利用しましょう。 Dxtoryでは75%または50%に縮小可能です(100%は縮小なし)。たとえば、PCゲームの解像度が1280×720の場合、「50%」を選択することによって640×360の画面サイズの録画ファイルとなります。また、「サイズ」で任意のサイズを入力することもできます。 ▲画面の上へ 「オーディオ」タブ 音声の録音 通常は音声を録音するので、「サウンドを記録」をONにしておきます。つぎに、「オーディオコーデック」は「PCM」、「オーディオフォーマット」は「PCM 48000 Hz, 16 bit, ステレオ」を選択します。「PCM」以外を選択することもできますが、同項目を選ぶようにしてください。あとあとの動画編集などを考えた場合、「PCM」のほうが無難です。 「オーディオデバイス」の設定については少し複雑な話になります。まず、録音したい音声がゲーム音だけなのか、それともゲーム音に加えてマイク音声も録音したいのか明確にしましょう。設定方法が異なります。 ゲーム音のみを録音したい場合 ゲーム音のみを録音したい場合は簡単です。「デバイス」を「スピーカー」にするだけです。「ステレオ ミキサー」や「再生リダイレクト」があれば、そちらでもかまいません。いずれを選択してもゲーム音は録音できます。ただ、入力音量(録音音量)に差があるかもしれません。 ゲーム音+マイク入力を録音したい場合 ゲーム音とマイク入力をまとめて同時に録音したい場合は複雑な話になります。なぜなら、目的や環境によって多くのパターンが考えられるからです。 まず、もっともシンプルなパターンから見ていきましょう。ゲーム音とマイクをDxtoryで同時録音したいなら、基本的にステレオミキサー機能とマイクミュート解除機能が必要です(ステレオミキサーの基礎参照)。ただし、PCによっては両機能が搭載されていません。両機能がない場合は、ステレオミキサー機能およびマイクミュート解除機能を搭載したPCの周辺機器(例 Sound Blaster X-Fi Go! Pro)を追加するか、後述の2系統同時録音機能を使用しましょう。 PCにステレオミキサー機能およびマイクミュート解除機能が搭載されている場合、「デバイス」で「ステレオ ミキサー」または「再生リダイレクト」を選択します。ここで「スピーカー」を選択してしまうと、ゲーム音は録音できてもマイクが録音できないので注意しましょう。そして、OS側でマイクミュートを解除します。 かりに、ステレオミキサーがPCに搭載されているのに「ステレオ ミキサー」または「再生リダイレクト」を選択できない場合は、ステレオミキサーまたは再生リダイレクトを有効にしてDxtoryを再起動します(*4)。 ▲画面の上へ 「スクリーンショット」タブ 「スクリーンショット」タブでは、スクリーンショットについて設定することができます。スクリーンショットの保存場所については「フォルダー」タブで、またホットキーについては「ホットキー」タブでそれぞれ設定します。 「高速スクリーンショット」は、キーを押しているあいだスクリーンショットを撮影する機能です。指定した数を上限として撮影可能です(0は無制限)。「自動リピートスクリーンショット」は、指定した間隔でスクリーンショットを撮影する機能です。 ▲画面の上へ 「アドバンス」タブ 「アドバンス」タブでは、以上の設定以外の細かい設定について変更可能です。 「処理スレッド」は、マルチスレッド処理時の最大スレッド数を設定します。選択できる最大の数値にしておけばよいでしょう。そのほうがCPUの性能を発揮できます。 「ビデオFPS制限」は、PCゲームのフレームレートを指定した値に制限します。たとえば、ここを30fpsにするとPCゲームのフレームレートも30fpsに制限されます。CPU負荷を下げたい場合(PCの動作を軽くしたい場合)に使用してください(*5)。 ▲画面の上へ 2系統同時録音 意義 Dxtoryの2系統同時録音は、ひとつの動画ファイルにゲーム音とマイク入力を独立して同時録音する機能のことをいいます(*6)。簡単にいえば、録画終了後であってもゲーム音とマイクの音量バランスを変更できる、音を別個に加工・編集できるということです。また、Windows Vista/7/8の場合、PCにステレオミキサー機能およびマイクミュート解除機能がなくとも、ゲーム音とマイクを同時録音可能です。 下図は、2系統同時録音のイメージ図(左)とステレオミキサー+マイクミュート解除録音のイメージ図(右)です。2系統同時録音ではゲーム音とマイク音声は独立しています。他方、ステレオミキサー機能とマイクミュート解除機能を使用して録音した場合は、ゲーム音とマイク音声は独立しておらず、両音声は完全にミックスされます。 ▲2系統同時録音のイメージ図(左)とステレオミキサー+マイクミュート解除録音のイメージ図(右) 2系統同時録音を使用するさいは、マイクはUSB接続の製品でもかまいません。USBマイクはそれ自体がオーディオデバイスとしてPCに認識されます。 注意点 2系統同時録音機能は、初心者にとって同機能を使いこなすのは少しハードルが高いかもしれません。動画編集ソフトを使う必要があったり、設定・手順でミスしやすい箇所がいくつかあるのです。最初は2系統同時録音ではなく、ステレオミキサー機能とマイクミュート解除機能を使って実況プレイ動画を作成するほうが無難ではあります。 PCによってはステレオミキサー機能およびマイクミュート解除機能が搭載されていない場合がありますが、その場合はUSBオーディオ(サウンドカード)とよばれるPCの周辺機器を用意すればよいのです。同製品の詳細についてはステレオミキサーの追加をご覧ください。 2系統同時録音の簡単な使い方 それでは、Windows Vista/7/8で2系統同時録音を行う方法を見ていきましょう。用意するものは、マイク(USB接続の製品でも可)、Audacityという音声の録音・編集ソフト、それに動画編集ソフト(例 AviUtl、Windows ムービーメーカー)です。 「オーディオ」タブで「サウンドを記録」がONになっていることを確認します。 「オーディオデバイス」で「デバイス」を「スピーカー」にします(*7)。 をクリックします。 するとというボタンが現れるので、このボタンをクリックします。 「サウンドを記録」がONになっていることを確認して、「オーディオデバイス」にある「デバイス」を「マイク」にします。 「デバイス」の下にある「ボリューム」を100にします。 録画を開始し、ゲームをプレイしながらマイクに声を入れて、録画を終了します(*8)。 録画ファイル上で右クリックして、「Extract Audio Stream」を選択します。 動画からゲーム音とマイクの2種類の音声ファイル(WAVE形式)が抽出されます。 Audacityを起動し、いま抽出した2個の音声ファイルをドラッグ&ドロップします。 Audacityで音量調整などを行います。ゲーム音よりもマイクが大きくなるように調整しましょう。マイクの音にノーマライズまたはコンプレッサーをかけると簡単です(詳細)。 Audacityで「ファイル」→「書き出し」の順にクリックしてWAVE形式で音声を保存します。 動画編集ソフトで動画と音声を読み込みます。 動画を保存して完成です。 ▲画面の上へ 関連ページ このページと関連性の強いページは以下のとおりです。 ページ名 内容 コメント 質問など PCゲームの録画 PCゲームを録画する方法 Windows ムービーメーカー 動画編集の方法 AviUtlの使い方 動画編集の方法 実況用PCマイク/こんなときは マイク使用時によくあるトラブルまとめ ▲画面の上へ
https://w.atwiki.jp/seigeki/pages/743.html
5メートルの使い方 作者:雨天決行 ◆bQJrO3CpYk 場所 悪の組織の本拠地の近く 時 ある日のお昼前 登場人物 レッド(本名=本名) ブルー(本名=本名) アクノボスダ(他にいい名前を考えよう) 上手と下手にそれぞれ平台が組んであり、敵ボスが上手平台に乗っている。レッドが下手から走って登場してくる。 レッド また会ったなアクノボスダ!今度こそ決着をつけてやる。 ボスダ ふっ・・・またやられに来たのかい?懲りない男だな君は。 レッド そんなことを言ってられるのも今のうちだ!今度こそお前を倒してやる! ボスダ やってみるがいいさ! レッド ブルー! 下手からブルーが歩いて登場 レッド ちょ、走れ!早くほら! ブルー あーはい・・・ レッド グリーン! 間 レッド (焦る)グリーン? ブルー あー・・・そうだった・・・グリーンなんかノロウィルスのかかったらしいですよ。 レッド ・・・ん?え?・・・は?・・・どういうこと? ブルー 今日はあいつ休みです。 間 レッド イエロー! ブルー あー・・・あのデブやめたらしいですよ。 レッド (焦って)え?ちょ・・・な、何で? ブルー ピンクと駆け落ちしたって噂ですよ。 レッド 誰がそんな噂してんだよ ブルー 経理課の恵ちゃんが言いふらしてました。 レッド ということは・・・今日のメンバーは・・・ ブルー 俺と先輩の二人っすね。まぁ適当に頑張りましょうか レッド ・・・うん・・・そうだな・・・ レッド、センターで決めポーズ レッド 我が名はレッド!炎の魂をもつ男! ブルー、レッドから少し離れた場所で決めポーズ ブルー 我が名はブルー!・・・えっと、冷めた・・・じゃない、えー、氷の魂を持つ男! 間 レッド、気まずそうにアクノボスダの近くまでいく レッド あの、申し訳ないんですけど・・・延期とかってできますか?
https://w.atwiki.jp/kumikomi-yitjc/pages/150.html
電圧などのアナログ値をデジタル値(数値)に変換する装置(ハードウエア)をA/D変換器(Analog to Digital Converter)という。 例えば、図の様なアナログの信号(電圧値)があった時に①の点では、2Vであったとすると、AD変換器(以下、ADC)を使えば、この電圧値を数値に変換する事が出来る。 ADCでアナログ電圧を数値に変換する事を、サンプリングと言う。サンプリングの周期は、アナログ電圧の周波数に対して、十分短い事が要求される。具体 的には、アナログ電圧の最大の周波数成分に対して2倍以上の速度でサンプルすれば良い事が知られている。(サンプリング定理) ただし、実用上は3倍以上、出来れば10倍程度の速度でサンプルすることが望ましい。 変換結果とアナログ電圧の関係 アナログ入力電圧は、ADCによって数値に変換される。この時、数値と実際の電圧との関係は、以下のようになる。 ADCの分解能は10bit(0~1023の数値を表現できる)なので、基準電圧を2.56Vとすると、この間を1024等分する事になる。つまり、 式:変換後の数値と入力電圧・基準電圧の関係 変換後の数値(ADCH、ADCL) = (入力電圧[V](ADC0~ADC12ピン) × 1023) / 2.56(基準電圧:VREF) ということになる。【注意】 ここで入力電圧の上限を5Vとしているが、正確には電源電圧が上限となる。従って、電池(3V)などでマイコンを動作させた場合は、3Vが上限になる事に注意。 (USB給電を行った場合は、5V) 上限を超える電圧を加えると、マイコンが破壊する。 AVRマイコン(ATMega32U4)に実装されているADCの主な仕様は、以下の通り 分解能10-bit 変換時間 13μs - 260μs アナログ入力12チャンネル(同時使用は1チャンネル) 入力可能電圧は 0 - VCC(USB使用の場合は+5V) 1.1Vの基準電圧源を内蔵 (2.56V ?) 連続変換、単発変換の切り替え 割り込みに対応 などである。 プログラミングの手順 設定内容は以下の通り、 AD変換器(以降、ADC)のON/OFF切り替え(ADCSRAレジスタ:ADENビット(第7ビット)) ADENビットを1にすることで、ADCを起動する。 ADCSRA |= _BV(ADEN); // AD変換器を起動 AD変換の起動設定(ADCSRA:ADATEビット(第5ビット)、ADCSRB:ADSTxビット(第0から第3ビット)) AD変換をスタート(トリガともいう)させるイベントを選択する。例えばタイマなどの比較一致などが選択できる。 ADATEビットを1にセットすると、ADCSRBレジスタのADTS3からADTS0ビットの設定が有効になる。それぞれ、以下のように機能が割り当てられている。 表:トリガモード一覧 ADCSRBレジスタ:bitの位置 (ビットの名前) 3 (ADTS3) 2 (ADTS2) 1 (ADTS1) 0 (ADTS0) 連続変換 0 0 0 0 アナログ比較器 0 0 0 1 外部割込み(IRQ0) 0 0 1 0 タイマ0 比較・一致 0 0 1 1 タイマ0 オーフロー(TCNT0) 0 1 0 0 タイマ1 比較・一致 (OCR1B) 0 1 0 1 タイマ1 オーバフロー(TCNT1) 0 1 1 0 タイマ1 キャプチャイベント 0 1 1 1 タイマ4 オーバフロー 1 0 0 0 タイマ4 比較・一致 (OCR4A) 1 0 0 1 タイマ4 比較・一致 (OCR4B) 1 0 1 0 タイマ4 比較・一致 (OCR4D) 1 0 1 1 連続変換(AD変換を1回だけでなく、連続してどんどん行わせる)の設定にしたいなら、以下の様にする。 ADCSRA |= _BV(ADATE); // ADATEビットを1に設定 ADCSRB = 0b11110000; // ADTS3~0ビットを0に設定 ADATEビットを0にして、ADSCビット(ADCSRA)を1にすると、AD変換は1回だけ行われる。 ADCSRA = ~_BV(ADATE); // ADCSRAレジスタは初期値が0なので、通常はこの設定は不要 割り込み設定(ADCSRA:ADIFビット(第4ビット)、ADIEビット(第3ビット)) AD変換終了時の割り込みを使うかどうかを選択する。ADIFビットは、割り込みが有効であるか否かにかかわらず、変換が終了した場合に1がセットされる。この状態でADIEビットに1が設定されていれば、割り込みハンドラが呼び出される。ADIFビットは、必要に応じてプログラムでクリアする必要がある。(1を書き込むと、クリア(=0)される) ADCSRA |= _BV(ADIE); // AD割り込みを許可 ADCSRA = ~_BV(ADIE); // AD割り込みを禁止 // 割り込みを使わないで、変換終了をチェックする if (ADCSRA _BV(ADIF)) { ADCSRA |= _BV(ADIF); // ADIFフラグをクリアする // AD変換終了 } else { // AD変換実行中 } 変換時間設定(ADCSRA:ADPS2~0ビット(第0~第2ビット)) AD変換器の変換時間を設定する。AD変換のクロックは50~200KHzの間で設定できる。(1変換につき13クロックが必要となる) ※ADCSRレジスタのビット配置を参照 システムクロックが16MHzで、変換速度を104uS(104マイクロ秒)としたいなら、以下の様にする。 ADCSRA |= _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0); // ADPS2~0ビットが111 これで、何故、104uSなのかというと、 ○16MHz = 16000000 Hzで、これを1/128するので、125000Hz。 ○1クロック当たりの時間は1/125000なので、0.000008秒(=8マイクロ秒) ○1回の変換に13クロック必要なので、0.000008 × 13 = 0.000104秒 (=104マイクロ秒) つまり、1/0.000104=9615.38... で、1秒間で9515.4回(9.5kSPS)、アナログデータを数値に変換する事が出来る。 「こんなんじゃ、全然速度が足らん」、というあなた! 変換精度を犠牲に出来るのなら、変換速度を上げることもできます。(77kSPS/8bit位が上限?) 変換結果の出力方法(ADMUXレジスタ:ADLARビット(第5ビット)) 変換結果はADCレジスタ(16ビット)に記録されるが、AD変換器の分解能は10ビットなので、長さが合わない。このため、変換結果を上位側に詰めるか、下位側にするかを選択する。具体的には以下の通り。 表:AD変換結果のレイアウト(ADCレジスタ上のデータの場所)ADLAR=1 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ADC9 ADC8 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC1 ADC0 - - - - - - ADLAR=0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - - - - - - ADC9 ADC8 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC1 ADC0 実際のアクセスでは、ADCレジスタは8ビットずつ分割して2回に分けて(下位、上位の順)アクセスする。 上位側のレジスタはADCH、下位側のレジスタはADCLであり、ADLARの設定で、以上の様にデータが設定されることに注意する事。 基準電圧の設定(ADMUXレジスタ:REFS1,0ビット(第7,6ビット)) AD変換の変換値の基準となる電圧を指定する。変換値への影響については、上の計算式(式:変換後の数値と入力電圧・基準電圧の関係)を参照のこと 表:基準電圧減の選択 ADMUXレジスタ:bitの位置 (ビットの名前) 7 (REFS1) 6 (REFS0) AREFピン(ボード上はVREFピン)を基準電圧とする。 0 0 AVCC(Davinci32Uは5V)を基準電圧とする。 0 1 予約 1 0 内部2.56V基準電圧 1 1 入力チャンネルの選択(ADMUXレジスタ:MUX4~0ビット(第4~第0ビット)、 ADCSRBレジスタ:MUX5ビット(第5ビット)) ATMega32U4には12本のアナログ入力がある。これをどのように切り替えて使うかを選択する。 表:アナログ入力チャンネルの選択 ビット MUX5~MUX0 シングルエンド入力ピン 差動入力 (プラス側)ピン 差動入力 (マイナス側)ピン 倍率 00 0000 ADC0 N/A 00 0001 ADC1 00 0010 N/A 00 0011 00 0100 ADC4 00 0101 ADC5 00 0110 ADC6 00 0111 ADC7 00 1000 N/A N/A N/A N/A 00 1001 ADC1 ADC0 10x 00 1010 N/A N/A N/A 00 1011 ADC1 ADC0 200x 00 1100 N/A 00 1101 00 1110 00 1111 01 0000 ADC0 ADC1 1x 01 0001 N/A 01 0010 01 0011 01 0100 ADC4 ADC1 1x 01 0101 ADC5 ADC1 1x 01 0110 ADC6 ADC1 1x 01 0111 ADC7 ADC1 1x 01 1000 N/A 01 1001 01 1010 01 1011 01 1100 01 1101 01 1110 1.1V (VBAND GAP) 01 1111 0V (GND) 10 0000 ADC8 10 0001 ADC9 10 0010 ADC10 10 0011 ADC11 10 0100 ADC12 10 0101 ADC13 10 0110 N/A ADC1 ADC0 40x 10 0111 Temperature Sensor 10 1000 N/A ADC0 ADC0 10x 10 1001 ADC5 ADC0 10x 10 1010 ADC6 ADC0 10x 10 1011 ADC7 ADC0 10x 10 1100 ADC4 ADC1 10x 10 1101 ADC5 ADC1 10x 10 1110 ADC6 ADC1 10x 10 1111 ADC7 ADC1 10x 11 0000 ADC4 ADC0 40x 11 0001 ADC5 ADC0 40x 11 0010 ADC6 ADC0 40x 11 0011 ADC7 ADC0 40x 11 0100 ADC4 ADC1 40x 11 0101 ADC5 ADC1 40x 11 0110 ADC6 ADC1 40x 11 0111 ADC7 ADC1 40x 11 1000 ADC4 ADC0 200x 11 1001 ADC5 ADC0 200x 11 1010 ADC6 ADC0 200x 11 1011 ADC7 ADC0 200x 11 1100 ADC4 ADC1 200x 11 1101 ADC5 ADC1 200x 11 1110 ADC6 ADC1 200x 11 1111 ADC7 ADC1 200x また、アナログ入力にはシングルエンド伝送と差動伝送がある。 シングルエンド伝送とは、1本の信号線でGNDとの電圧の差で信号を伝達する方法 差動伝送とは、2本の信号線を使って両方の信号線の電圧の差を使って信号を伝達する方法 いずれの方法も一長一短があるが、より高速に長距離の信号伝送を行いたい場合はノイズに強い差動伝送が使われる。 AD変換スタート(ADCSRA:ADSTビット(第6ビット)) ADSTビットを1にするとAD変換をスタートする。連続変換中にAD変換を停止させたい場合は、0にする。 各レジスタのビットの配置は、以下の通り。 ADCSRAレジスタのビット配置 bitの位置 (ビットの名前) 7 (ADEN) 6 (ADSC) 5 (ADATE) 4 (ADIF) 3 (ADIE) 2 (ADPS2) 1 (ADPS1) 0 (ADPS0) 機能 ADEN=1 ADCを起動 ADEN=0 ADCを停止 ADSC=1 AD変換スタート ADSC=0 AD変換停止 「2.AD変換の 起動設定」を参照 AD変換終了 割り込みフラグ (「3.割り込み設定」を参照) ADIE=1 AD変換終了割り 込みを有効 ADIE=0 AD変換終了割り 込みを無効 (「3.割り込み設定」を参照) システムクロック の分周比 000 = 1/2 001 = 1/2 010 = 1/4 011 = 1/8 100 = 1/16 101 = 1/32 110 = 1/64 111 = 1/128 初期値 0 0 0 0 0 0 0 0 ADCSRBレジスタのビット配置 bitの位置 (ビットの名称) 7 (ADHSM) 6 (ACME) 5 (MUX5) 4 - 3 (ADTS3) 2 (ADTS2) 1 (ADTS1) 0 (ADTS0S0) 機能 高速変換モード 「表:アナログ入力チャンネルの選択」を参照 - 「表:トリガモード一覧」を参照 初期値 0 0 0 0 0 0 0 0 ADMUXレジスタのビット配置 bitの位置 (ビットの名前) 7 (REFS1) 6 (REFS0) 5 (ADLAR) 4 (MUX4) 3 (MUX3) 2 (MUX2) 1 (MUX1) 0 (MUX0) 機能 「表:基準電圧減の選択」参照 「表:AD変換結果のレイアウト」参照 「表:アナログ入力チャンネルの選択」参照 初期値 0 0 0 0 0 0 0 0 DIDR1レジスタのビット配置 bitの位置 (ビットの名称) 7 (ADC7D) 6 (ADC6D) 5 (ADC5D) 4 (ADC4D) 3 - 2 - 1 (ADC1D) 0 (ADC0D) 機能 MUX5~0で選択したピンについて、当該ビットを1にセットすると、デジタル入力機能がOFFとなり、 消費電力を削減できる。 初期値 0 0 0 0 0 0 0 0 DIDR0レジスタのビット配置 bitの位置 (ビットの名称) 7 - 6 - 5 (ADC13D) 4 (ADC12D) 3 (ADC11D) 2 (ADC10D) 1 (ADC9D) 0 (ADC8D) 機能 MUX5~0で選択したピンについて、当該ビットを1にセットすると、デジタル入力機能がOFFとなり、 消費電力を削減できる。 初期値 0 0 0 0 0 0 0 0 AD変換の入力ピン配置 前述の通り、ATMega32U4マイコンには12本のアナログ入力がある。それぞれの入力と、基板上のピンの対応は、以下の通り。 サンプルプログラム 以下の様に、スライドボリュームをADC0に接続し、ボリュームのつまみの位置によってLED(PC7)が点滅するプログラム例を、以下に示す。 スライドボリュームの出力は、0~5Vの間で変化するためADC0の入力電圧も、同様に変化する。この時のAD変換後の数値は、0~1023となる。 ○単発変換によるサンプル /* * ADの単発変換のサンプルプログラム */ #define F_CPU 16000000UL // 16MHz動作 _delay_ms()などに関係 #include avr/io.h #include util/delay.h #include avr/interrupt.h int main() { unsigned int t; CLKPR = 0x80; CLKPR = 0; // 16MHz動作のための設定 DDRC = 0b10000000; // デバッグ用のLED(PC7)の設定 // ADCの初期化 ADMUX |= _BV(REFS0); // 電源5Vを使用、ADC0を使用, データ右詰め ADCSRA |= _BV(ADEN) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0); // ADEN, ADSC, CK/128 ADCSRA |= _BV(ADSC); // ADをスタート while(1) { if (ADCSRA _BV(ADIF)) { // AD変換の終了を確認 ADCSRA |= _BV(ADIF); t = ADC; // ADCは16bit幅で、8bitずつ2回に分けてアクセスされるので、 // 変数アクセス中に割り込みが発生しないように注意すること if (t 512) { PORTC = 0b10000000; } else { PORTC = 0b00000000; } ADCSRA |= _BV(ADSC); // ADを再スタート } } } ○連続変換によるサンプル /* * ADの連続変換のサンプルプログラム * #define F_CPU 16000000UL // 16MHz動作 _delay_ms()などに関係 #include avr/io.h #include util/delay.h #include avr/interrupt.h int main() { unsigned int t; CLKPR = 0x80; CLKPR = 0; // 16MHz動作のための設定 DDRC = 0b10000000; // デバッグ用のLED(PC7)の設定 // ADCの初期化 ADMUX |= _BV(REFS0); // 電源5Vを使用、ADC0を使用, データ右詰め ADCSRA |= _BV(ADEN) | _BV(ADPS2) | _BV(ADATE)| _BV(ADPS1) | _BV(ADPS0); // ADEN, ADSC, CK/128 ADCSRB = 0b11110000; // ADTS3~0を0で連続変換 ADCSRA |= _BV(ADSC); // ADをスタート while(1) { if (ADCSRA _BV(ADIF)) { // AD変換の終了を確認 t = ADC; // ADCは16bit幅で、8bitずつ2回に分けてアクセスされるので、 // 変数アクセス中に割り込みが発生しないように注意すること if (t 512) { PORTC = 0b10000000; } else { PORTC = 0b00000000; } } } } AD変換と割り込み /* * AD割り込みのサンプルプログラム */ #define F_CPU 16000000UL // 16MHz動作 _delay_ms()などに関係 #include avr/io.h #include util/delay.h #include avr/interrupt.h // 割り込みハンドラISR(ADC_vect) { unsigned int t; t = ADC; // ADCは16bit幅で、8bitずつ2回に分けてアクセスされるので、 // 変数アクセス中に割り込みが発生しないように注意すること if (t 512) { PORTC = 0b10000000; } else { PORTC = 0b00000000; } } int main() { CLKPR = 0x80; CLKPR = 0; // 16MHz動作のための設定 DDRC = 0b10000000; // デバッグ用のLED(PC7)の設定 // ADCの初期化 ADMUX |= _BV(REFS0); // Vcc(5V)を基準、ADC0を使用, データ右詰め ADCSRA |= _BV(ADEN) |_BV(ADIE)| _BV(ADATE) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0); // ADEN, ADIE, ADATE, CK/128 ADCSRB = 0b11110000; // 連続変換 ADCSRA |= _BV(ADSC); // ADをスタート sei(); // 全ての割り込みを許可 while(1) { } }
https://w.atwiki.jp/rkanbe/pages/27.html
まず、Ktai Library がインストールされた状態で、 $ktai- emoji(0xF89F); とソースコードに書くと絵文字を表示出来ます。 絵文字の文字コードは下記を参考に。出力コードの前に 0x をつけるようです。 作ろうiモードコンテンツ:基本絵文字一覧 | サービス・機能 | NTTドコモ 上記のサンプルコードは、UTF-8 で太陽なので、 0x と F89F をあわせて 0xF89F となっています。 ※以下、マニュアルより抜粋 ◎絵文字を表示する string emoji(mixed $code, bool $disp = true, int $carrier = null, $output_encoding = null, $binary = true) 指定した絵文字を入手します。 $codeは、iMODE文字の他、文字コードを数値として入力することができます。 $dispを省略すると、ビューに直接表示を行います(echoが不要です)。 $carrierにキャリアコードを指定すると、そのキャリアに対応した絵文字を入手する ことが出来ます。省略すると現在アクセスしている端末の絵文字が出力されます。 output_encodingで出力文字コードを指定できます。無指定の場合は、 ライブラリクラスインスタンスの設定値が利用されます。 binaryをtrueにすると絵文字はバイナリ文字列として出力されます。falseにすると 数値指定(&#?????; / &#x????;)を出力します。 ■絵文字画像の使用 本ライブラリは、TypePadで使用されている絵文字画像に対応しています。別途 ダウンロードしたものを設置し、設定することで、PCもしくは各キャリアで割り当ての ない絵文字を絵文字画像で置き換えることが出来ます。 絵文字画像の使用は、次の手順で行います。 1:絵文字画像を次のURLから入手する ▼TypePadの絵文字アイコン画像と、携帯表示モジュールをフリー(自由)ライセンスで 公開 http //start.typepad.jp/typecast/ 2:入手したアーカイブを解凍し、emoiconフォルダをapp/webroot/img/にコピーする 3:コンポーネント・ヘルパー内の絵文字画像のオプションを設定する。 $this- ktai[ use_img_emoji ] = true; (コントローラ内処理で設定する場合) $ktai- options[ use_img_emoji ] = true; (ビュー内処理で設定する場合) ※初期設定方法は「■設定」項目をご覧ください なお、サイトで絵文字画像を使用する場合は、画像についての利用規約に従って ご利用いただきますようお願いいたします。 ◎iMODE絵文字を他キャリア用に変換する void convert_emoji(string &$str, int $carrier = null, $input_encoding = null, $output_encoding = null, $binary = true) $str内を各キャリアに対応した絵文字で変換します。 $str内で定義されている絵文字は、iMODE用である必要があります。それ以外の 絵文字は変換されません。 各キャリア対応絵文字で、iMODE絵文字に相当するものがない場合、テキスト文字 または絵文字画像で変換されます。 input_encodingで入力文字コード、output_encodingで出力文字コードを指定 できます。無指定の場合は、ライブラリクラスインスタンスの設定値が利用されます。 binaryをtrueにすると絵文字はバイナリ文字列として出力されます。falseにすると 数値指定(&#?????; / &#x????;)を出力します。 設定項目 絵文字画像関連設定 画像絵文字を使用する場合の設定です。 デフォルトはTypePad絵文字を標準的に使用する際の設定となっています。 画像絵文字使用フラグ(bool) use_img_emoji = false, 機種によって割り当てのない絵文字について、画像絵文字を適用します。 画像絵文字格納URL(string) img_emoji_url = ./img/emoticons/ , 画像絵文字の格納場所を指定します。この設定がimgタグのsrcに記載されます。 画像絵文字拡張子(string) img_emoji_ext = gif , 画像絵文字の拡張子を指定します。 画像絵文字の画像サイズ(array(int, int)) img_emoji_size = array(16, 16), 画像絵文字の画像サイズを(width, height)で指定します。
https://w.atwiki.jp/superlink/pages/15.html
URLをページに表示させるまでの使い方を軽く説明していこうかと思います。 まず、左側のメニューより自分のリンクしたいホームページやサイトに合ったジャンルを選びます。さらにジャンルがある場合はまたその中から選んで下さい。最下層のみ編集可能ですので、その他のページは編集不可能となっております。 次に、そのリンクさせたいサイトのジャンルのページまでいきましたら、上の方に @wikiメニュー 編集 表示 ツール ヘルプ ブックマーク登録 RSS登録....... といったものがあるかと思いますが、その編集というボタンを押します。すると、 このページを編集 このページをコピーして新規ページを作成 このページのページ名を変更 などあるかと思いますが、その中で「このページを編集」というボタンを押します。 すると、ワードのような画面が出てくるかと思います。これはアットウィキエディタというもので構成されています。その画面が出てきましたら、ページを保存の下に絵やアイコンなどがあるかと思います。その中で鎖みたいなアイコンがあるかと思います。そいつを使ってリンクを表示させます。まず、その表示させたい部分をクリックして、鎖のアイコンを押してください。すると [ [リンク名 URL] ](]]と[[の間は一つあけていますのは仕様です) というのが出てきます。そのままなのですが、リンク名というところに表示させたい名前を書きます。そのサイトの題名などで構いません。そして の右側にはそのサイトのURLを入れるだけで完了です。こんな感じですね。 最後に必ずページ保存を忘れないようにして下さい。 リンク集あっとうぃき ってな感じです。尚、リンクは間をあけないでよろしいです。また、横には書かないようにしてください。例えば、 リンク名 リンク名 こんなように、リンクとリンクの間が一行あいてたり、 リンク名リンク名 こんな風にリンクとリンクが隣り合わせになったりとしないようにして下さい。こんなように、 リンク名 リンク名 リンク名 なれば良いです。
https://w.atwiki.jp/studiozodiac/pages/542.html
Day by day/2007年09月13日/絵描きチャットルーム利用に際して Day by day/2007年09月13日/絵描きチャット会 #blognavi
https://w.atwiki.jp/thiroyoshi/pages/29.html
MPIの使い方や、動作の仕方といったことのメモ MPIとは? MPIは「Message Passing Interface」ってもので、要するにメッセージでの送受信を行いノード間の協調を図るもの。 これ自体がプログラミング言語なのではなく、ライブラリである。 使用する際には、「mpi.h」または「mpi++.h」をインクルードする必要がある。 メッセージの送受信には用意されている関数を用いる。これにも色々な方法があるよう。 MPIの動作 基本的にMPIを使用する用にコンパイルしたものは、指定したノードの数で実行される。(ノードの数の指定はシェルスクリプトで) 各ノードで実行されるプログラムは実際には同じものが動いている。つまり、すべてmain関数から処理を行っている。 では、何が利点か?それは、各ノードにはプロセス毎にノードの番号(rank)が割り当てられており、これによってif文などを用いて処理の分担を行う。 つまり、MPIは「並列処理」というよりも「分散処理」という側面が強いとも言える。 MPIの使い方 とりあえずサンプルを載せる。 #include stdio.h #include string.h #include iostream #include "mpi++.h" using namespace std; int main(int argc, char* argv[]){ int my_rank; //ノードの番号 int p; //すべてのノードの合計数 int source; //メッセージの送信元番号 int dest; //メッセージの送信先番号 int tag = 0; //メッセージタグ char message[100]; //メッセージ MPI_Status status; MPI_Init( argc, argv); //MPI関数を呼び出すための初期化 MPI_Comm_rank(MPI_COMM_WORLD, my_rank); //今プログラムが走っているノードの番号(rank)を取得 MPI_Comm_size(MPI_COMM_WORLD, p); //ノードの合計数を取得 //printf("Hello! %d\n", my_rank); //cout "Hello! " my_rank endl; //rankが0でないノードでのみ実行する if(my_rank != 0){ //メッセージに以下の文を格納する sprintf(message, "Greetings from process %d", my_rank); //printf("My rank is %d\n", my_rank); //cout "My rank is " my_rank endl; dest = 0; //0ノードに送信先を設定 //0ノードにmessageを送信 MPI_Send(message, strlen(message)+1, MPI_CHAR, dest, tag, MPI_COMM_WORLD); } //0ノードで実行される else{ //全ノード分ループをまわす for(source = 1; source p; source++){ //source番目のノードからmessageを受け取り、 MPI_Recv(message, 100, MPI_CHAR, source, tag, MPI_COMM_WORLD, status); //表示 printf("%s\n", message); //cout message endl; } } //最後の処理 MPI_Finalize(); } 出力結果 %NQSII(INFO) ------- Output from job 0000 ------- Warning no access to tty (Bad file descriptor). Thus no job control in this shell. [0] Greetings from process 1 [0] Greetings from process 2 [0] Greetings from process 3 [0] Greetings from process 4 [0] Greetings from process 5 [0] Greetings from process 6 [0] Greetings from process 7 [0] Greetings from process 8 [0] Greetings from process 9 %NQSII(INFO) ------- Output from job 0001 ------- %NQSII(INFO) ------- Output from job 0002 ------- %NQSII(INFO) ------- Output from job 0003 ------- %NQSII(INFO) ------- Output from job 0004 ------- 出力の左端[0]は、0ノードでの出力を表している 各ノードでmain関数がそのまま流れており、if文でmy_rankを判定材料として処理を分担している。 各ノードは0ノードにメッセージを送り、0ノードはそれらを逐一読み取り、表示している。 どのメッセージをどこで受信するかを示すもの →つまり、このタグが合うところでのみメッセージの受信ができる 上記のサンプルで、コメントアウトしているprintfとcoutがある。 →printfはしっかり出力をするが、coutは他のスレッドの割り込みを禁止することができていないようで、表示が割り込まれることがあるので使用しないことをオススメする printfをコメントアウトしなかった場合の出力は以下 %NQSII(INFO) ------- Output from job 0000 ------- Warning no access to tty (Bad file descriptor). Thus no job control in this shell. [0] Hello! 0 [1] Hello! 1 [1] My rank is 1 [0] Greetings from process 1 [0] Greetings from process 2 [0] Greetings from process 3 [0] Greetings from process 4 [0] Greetings from process 5 [0] Greetings from process 6 [0] Greetings from process 7 [0] Greetings from process 8 [0] Greetings from process 9 %NQSII(INFO) ------- Output from job 0001 ------- [2] Hello! 2 [3] Hello! 3 [3] My rank is 3 [2] My rank is 2 %NQSII(INFO) ------- Output from job 0002 ------- [4] Hello! 4 [4] My rank is 4 [5] Hello! 5 [5] My rank is 5 %NQSII(INFO) ------- Output from job 0003 ------- [6] Hello! 6 [6] My rank is 6 [7] Hello! 7 [7] My rank is 7 %NQSII(INFO) ------- Output from job 0004 ------- [8] Hello! 8 [8] My rank is 8 [9] Hello! 9 [9] My rank is 9 各ノードでの出力がどれになっているか注意 また、スパコンでのMPIのプログラムの出力は、outputのファイルはできない。 出力結果は、実行後に作成される「run.sh.o(ジョブID)」というファイルに書き込まれている。 また、同時に出力されている「run.sh.e(ジョブID)」はエラー関係が出力されている。 さらにシェルスクリプトを紹介 #PBS -l cputim_job=00 05 00 //cpu動作時間 #PBS -l memsz_job=2gb //メモリサイズ #PBS -l cpunum_job=2 //使用コア数 #PBS -T vltmpi #PBS -b 5 //ノード数 #PBS -q PCL-B //使用マシン cd MPI_sample //ディレクトリ移動 mpirun_rsh -np 10 ${NQSII_MPIOPTS} ./a.out //数字の10は(ノード数)×(CPUコア数) 内積 これには、MPI_Reduce()という関数を使う。とりあえずサンプル。 #include stdio.h #include string.h #include"mpi++.h" using namespace std; //内積を実際に計算する関数(局所的な計算) int Serial_dot(int x[], int y[], int n){ int i; int sum = 0; for(i = 0; i n; i++) sum = sum + x[i]*y[i]; return sum; } //各ノードの内積をまとめる関数 //各ノードでSerial_dot()でそれぞれの内積を求めて、MPI_Reduce()でまとめる //0ノード以外の返り値は0 int Parallel_dot(int local_x[], int local_y[], int n_bar){ int local_dot; int dot = 0.0; int Serial_dot(int x[], int y[], int m); local_dot = Serial_dot(local_x, local_y, n_bar); printf("local_dot = %d\n", local_dot); MPI_Reduce( local_dot, dot, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); return dot; } int main(int argc, char* argv[]){ int n = 20; //全配列数 int my_rank; //ノード番号 int p; //全ノード数 //MPIの初期化 MPI_Init( argc, argv); //ノード番号取得 MPI_Comm_rank(MPI_COMM_WORLD, my_rank); //全ノード数取得 MPI_Comm_size(MPI_COMM_WORLD, p); int n_bar = n/p; //各ノードでの配列数 int x[n_bar]; int y[n_bar]; int dot; //求める内積 //printf("n_bar = %d\n", n_bar); //初期値設定 for(int i = 0; i n_bar; i++){ x[i] = my_rank; y[i] = my_rank; } //各ノードでの内積計算 dot = Parallel_dot(x,y,n_bar); //if(my_rank == 0) printf("dot = %d\n", dot); MPI_Finalize(); } 出力結果 %NQSII(INFO) ------- Output from job 0000 ------- Warning no access to tty (Bad file descriptor). Thus no job control in this shell. [0] local_dot = 0 [1] local_dot = 2 [1] dot = 0 [0] dot = 570 %NQSII(INFO) ------- Output from job 0001 ------- [2] local_dot = 8 [3] local_dot = 18 [3] dot = 0 [2] dot = 0 %NQSII(INFO) ------- Output from job 0002 ------- [4] local_dot = 32 [5] local_dot = 50 [5] dot = 0 [4] dot = 0 %NQSII(INFO) ------- Output from job 0003 ------- [6] local_dot = 72 [7] local_dot = 98 [7] dot = 0 [6] dot = 0 %NQSII(INFO) ------- Output from job 0004 ------- [8] local_dot = 128 [9] local_dot = 162 [9] dot = 0 [8] dot = 0 MPI_Reduce() 計算を行い、指定した根ノードにのみ計算結果を返す。 そのため、他の各ノードでは返り値は0である。 各引数は次のようになっている。 int MPI_Reduce( void operand, //計算したい値のポインタ void result, //計算した結果を保存するポインタ int count, //データをいくつ送るか(数字1つなら1) MPI_Datatype datatype, //送信するデータの型(上ではMPI_INT) MPI_Op operator, //なんの計算をするか(上では総和をとるのでMPI_SUM) int root, //根ノードの番号(0でよい) MPI_Comm comm //特になにもなければMPI_COMM_WORLDでよい ){} MPI_Opについては定義済み操作が多く存在する。それらに関しては、windowsサーバに置いてあるMPIの教科書(p81)を参照のこと 計算結果が格納されるのは、rootに指定したノードでのresultにのみ。 MPI_Allreduce() MPI_Reduce()では根以外のノードでの返り値が0であったが、これでは全てのノードに計算結果を返すことができる。 引数はほぼMPI_Reduce()と同じ。 int MPI_ALLreduce( void operand, //計算したい値のポインタ void result, //計算した結果を保存するポインタ int count, //データをいくつ送るか(数字1つなら1) MPI_Datatype datatype, //送信するデータの型(上ではMPI_INT) MPI_Op operator, //なんの計算をするか(上では総和をとるのでMPI_SUM) MPI_Comm comm //特になにもなければMPI_COMM_WORLDでよい ){} 上記のサンプルプログラムで、MPI_Reduce()をMPI_AllReduce()にしたときの出力結果を示す %NQSII(INFO) ------- Output from job 0000 ------- Warning no access to tty (Bad file descriptor). Thus no job control in this shell. [0] local_dot = 0 [1] local_dot = 2 [0] dot = 570 [1] dot = 570 %NQSII(INFO) ------- Output from job 0001 ------- [2] local_dot = 8 [3] local_dot = 18 [2] dot = 570 [3] dot = 570 %NQSII(INFO) ------- Output from job 0002 ------- [4] local_dot = 32 [5] local_dot = 50 [5] dot = 570 [4] dot = 570 %NQSII(INFO) ------- Output from job 0003 ------- [6] local_dot = 72 [7] local_dot = 98 [7] dot = 570 [6] dot = 570 %NQSII(INFO) ------- Output from job 0004 ------- [8] local_dot = 128 [9] local_dot = 162 [9] dot = 570 [8] dot = 570 行列とベクトルの積 マトリクスとベクトルの積を並列に行うプログラム。 #include stdio.h #include string.h #include vector #include"mpi++.h" using namespace std; vector double MV(vector vector double iterator local_A, int m, int n, vector double iterator local_x, int local_m, int local_n){ vector double local_y; //計算用の一時変数 local_y.resize(local_n); vector double global_x; //ベクトル全体 global_x.resize(n); vector double global_y; //計算結果のベクトル global_y.resize(n); //各プロセスからベクトルxを集める MPI_Allgather(local_x, local_n, MPI_DOUBLE, global_x.begin(), local_n, MPI_DOUBLE, MPI_COMM_WORLD); //掛け算 for(int i = 0; i local_m; i++){ local_y[i] = 0.0; for(int j = 0; j n; j++) local_y[i] = local_y[i] + local_A[i][j]*global_x[j]; } //計算結果を集める MPI_Allgather(local_y.begin(), local_n, MPI_DOUBLE, global_y.begin(), local_n, MPI_DOUBLE, MPI_COMM_WORLD); return global_y; } int main(int argc, char* argv[]){ int n = 20; int m = 20; int my_rank; int p; MPI_Init( argc, argv); MPI_Comm_rank(MPI_COMM_WORLD, my_rank); MPI_Comm_size(MPI_COMM_WORLD, p); int local_n = n/p; int local_m = m/p; vector double x; vector vector double A; //掛け算する行列(各プロセスで一部ずつをもつ) A.resize(local_m); x.resize(local_n); //掛け算するベクトル(各プロセスで一部ずつをもつ) for(int i = 0; i local_m; i++) A[i].resize(n); for(int a = 0; a local_m; a++){ x[a] = my_rank; for(int b = 0; b n; b++) A[a][b] = 1.0; } //行列×ベクトル vector double y; y = MV(A.begin(),m,n,x.begin(),local_m,local_n); for(int i = 0; i n; i++) printf("y[%d] = %f\n",i,y[i]); MPI_Finalize(); } すぐに使えるであろう関数の形にまで落としこんだ。 行列×ベクトルを行っている部分をこれで置き換えれば、それで事足りるはず。 詳細な仕様はここには書きづらいので、直接聞いてもらえるといいかも。もちろんプログラムから察してくれれば一番だが。 が、簡単に書いておく ・行列A n×n行列。行方向で区切ったものを各プロセスでもつ。つまりlocal_Aはlocal_m×n行列になっている。 ・ベクトルx n行ベクトル。行方向で区切った部分を各プロセスでもつ。つまり各プロセスではlocal_m行のベクトル。 ・プロセス数と行数・列数 当然のことながら、行数・列数はプロセス数で割り切れなければならない。 最後に取得するベクトルyはn行の完全なベクトルになっている。上記のプログラムの出力結果は以下。 プロセス数10・行数列数20で計算 %NQSII(INFO) ------- Output from job 0000 ------- Warning no access to tty (Bad file descriptor). Thus no job control in this shell. [0] y[0] = 90.000000 [0] y[1] = 90.000000 [0] y[2] = 90.000000 [0] y[3] = 90.000000 [0] y[4] = 90.000000 [0] y[5] = 90.000000 [0] y[6] = 90.000000 [0] y[7] = 90.000000 [0] y[8] = 90.000000 [0] y[9] = 90.000000 [0] y[10] = 90.000000 [0] y[11] = 90.000000 [0] y[12] = 90.000000 [0] y[13] = 90.000000 [0] y[14] = 90.000000 [0] y[15] = 90.000000 [0] y[16] = 90.000000 [0] y[17] = 90.000000 [0] y[18] = 90.000000 [0] y[19] = 90.000000 [1] y[0] = 90.000000 [1] y[1] = 90.000000 [1] y[2] = 90.000000 [1] y[3] = 90.000000 [1] y[4] = 90.000000 [1] y[5] = 90.000000 [1] y[6] = 90.000000 [1] y[7] = 90.000000 [1] y[8] = 90.000000 [1] y[9] = 90.000000 [1] y[10] = 90.000000 [1] y[11] = 90.000000 [1] y[12] = 90.000000 [1] y[13] = 90.000000 [1] y[14] = 90.000000 [1] y[15] = 90.000000 [1] y[16] = 90.000000 [1] y[17] = 90.000000 [1] y[18] = 90.000000 [1] y[19] = 90.000000 … … ‥(以下同様) 行列と行列の積 一応できた。早いかはしらんw #include stdio.h #include string.h #include vector #include"mpi++.h" using namespace std; vector vector double MV(vector vector double iterator local_A, int m, int n, vector vector double iterator local_x, int local_m, int local_n){ vector double local_y; local_y.resize(local_n); vector double global_x; global_x.resize(n); vector vector double global_y; global_y.resize(n); for(int i = 0; i n; i++) global_y.resize(n); vector double global_tmp; global_tmp.resize(n); for(int k = 0; k n; k++){ MPI_Allgather(local_x[k].begin(), local_n, MPI_DOUBLE, global_x.begin(), local_n, MPI_DOUBLE, MPI_COMM_WORLD); for(int i = 0; i local_m; i++){ local_y[i] = 0.0; for(int j = 0; j n; j++) local_y[i] = local_y[i] + local_A[i][j]*global_x[j]; } MPI_Allgather(local_y.begin(), local_n, MPI_DOUBLE, global_tmp.begin(), local_n, MPI_DOUBLE, MPI_COMM_WORLD); global_y[k] = global_tmp; } return global_y; } int main(int argc, char* argv[]){ int n = 20; int m = 20; int my_rank; int p; MPI_Init( argc, argv); MPI_Comm_rank(MPI_COMM_WORLD, my_rank); MPI_Comm_size(MPI_COMM_WORLD, p); int local_n = n/p; int local_m = m/p; vector vector double A; vector vector double x; A.resize(local_m); for(int i = 0; i local_m; i++) A[i].resize(n); x.resize(n); for(int i = 0; i n; i++) x[i].resize(local_m); for(int a = 0; a local_m; a++){ for(int b = 0; b n; b++){ A[a][b] = 1.0; x[b][a] = my_rank; } } vector vector double y; y = MV(A.begin(),m,n,x.begin(),local_m,local_n); for(int i = 0; i n; i++){ for(int j = 0; j m; j++) printf("y[%d][%d] = %f\n",j,i,y[j][i]); } MPI_Finalize(); } 出力結果 %NQSII(INFO) ------- Output from job 0000 ------- Warning no access to tty (Bad file descriptor). Thus no job control in this shell. [0] y[0][0] = 90.000000 [1] y[0][0] = 90.000000 [1] y[1][0] = 90.000000 [1] y[2][0] = 90.000000 [1] y[3][0] = 90.000000 [1] y[4][0] = 90.000000 [1] y[5][0] = 90.000000 [1] y[6][0] = 90.000000 [1] y[7][0] = 90.000000 [1] y[8][0] = 90.000000 [1] y[9][0] = 90.000000 [1] y[10][0] = 90.000000 [1] y[11][0] = 90.000000 [1] y[12][0] = 90.000000 [1] y[13][0] = 90.000000 [1] y[14][0] = 90.000000 [1] y[15][0] = 90.000000 [1] y[16][0] = 90.000000 [1] y[17][0] = 90.000000 [1] y[18][0] = 90.000000 [1] y[19][0] = 90.000000 [1] y[0][1] = 90.000000 [1] y[1][1] = 90.000000 [1] y[2][1] = 90.000000 [1] y[3][1] = 90.000000 [1] y[4][1] = 90.000000 [1] y[5][1] = 90.000000 [1] y[6][1] = 90.000000 [1] y[7][1] = 90.000000 [1] y[8][1] = 90.000000 [1] y[9][1] = 90.000000 [1] y[10][1] = 90.000000 [1] y[11][1] = 90.000000 [1] y[12][1] = 90.000000 … … ‥(以下同様) #bf 名前 コメント
https://w.atwiki.jp/fysl/pages/257.html
アットウィキの使い方 よくある質問/利用に関して - アットウィキ(@WIKI)ご利用ガイド - atwiki(アットウィキ) https //w.atwiki.jp/guide/pages/30.html アットウィキの基本操作/その他/ページの編集権限または閲覧権限を変更する - アットウィキ(@WIKI)ご利用ガイド - atwiki(アットウィキ) https //w.atwiki.jp/guide/pages/1186.html
https://w.atwiki.jp/dayz777/
コールオブデューティー ブラックオプスディクラシファイド(通称 COD BOD) ○クランメンバー○ §クランリーダー§ ○viset777(SRしかできないw ちょいちょいキル稼いでいくStyle) ∇クランメンバー∇ ○kurafutopop (SR AT専門) ○yukito2391 (SR アシスト専門) ○SHANA-TUNA-3150(特にポジション決まってない新入クラメン)