スキップしてメイン コンテンツに移動

第47回 CLR/H 勉強会に参加してきた

2010/04/17に第47回 CLR/H 勉強会が開催されたので参加していた。
今回は「並列」がキーワードだろうか。人間の脳はマルチタスクは2つまでが限界と研究結果が発表されたらしいが、最近のCPUはどんな状況だろうか。

最新CPUの紹介と並列プログラミングの概要

  • インテルマイクロアーキテクチャー「Nehalem」
  • 目標は「電源効率に優れたプロセッサー」
  • ハイパースレッディングテクノロジーが復活
  • キャッシュをいかに有効に使用するか、がアプリケーションのパフォーマンスに影響する
  • 3次キャッシュ:占有か共有か
  • インテルコンパイラ、VisualStudio2010
  • Core2Duo向けのアプリをQuadで動かすとパフォーマンスが上がらないケースがある
  • 2010年、すべてのCPUが並列プロセッサになった。
  • Intellが提供するツール:Parallel Studio
  • ハイパースレッドとターボブーストがチューニング作業では邪魔となる
    →チューニング中はOFFにするとよい

マルチコア時代の並列プログラミング - Visual Studio 2010 による並列化・最適化技法

  • 並列化は

    • 今から「意識」するべき
    • どこに使うかを考える
    • モジュール化プロファイルは現在のプロジェクトにも効果的(並列に限らず)
  • 並列化で苦労は増える
  • 並列と同時実行は別
  • CLR4.0でスレッドプールの仕組みが変わった
  • UMS(ユーザーモードスケジューラ)はC++のみ。64ビットのみ。
  • 並列プログラミングの考え方(タスク・データ・順序)
  • キャッシュを意識したプログラミングが必要
  • .NET Framework 4.0ではタスク並列ライブラリ(TPL)を使用
  • C++では並列パターンライブラリ(PPL)を使用
  • Threadを自分で作成するのはやめるべき(一つのThreadは高価)
  • ラムダ式を使用すると並列化しやすい
  • スレッド数の調整:IOに対しては制限したほうが良いかもしれない。CPUに対してはある程度自動に最適化されるが、一概には言えない
セッション1でもセッション2でも「キャッシュを意識したプログラミングが必要」とのこと。

F#入門 ~関数プログラミングとは何か~

  • OCamlをベースに設計された言語
  • F#の魅力としてマルチパラダイムがある(言語指向型プログラミングなど)
  • 見た目の美しさ(lightweight syntaxをOnにすることで、インデントによるブロックの表現)
  • デメリット

    • Express Editionが存在しない
    • IDEの機能が現時点で不完全
    • インテリセンスの品質
    • 日本語情報が不足
  • 環境は3択

    • Visual Studio 2010 Pro以上
    • Visual Studio Shell (IronPythonなどもある)
    • F# CTP
  • 関数は第一級の扱い(変数などと同等)
  • 値は変更できない(参照透過性)
  • 関数は常に一つの引数を受け取って、一つの値を返す
  • 複数の引数を扱うには、タプルを使用、または関数の中に関数を定義
  • カリー化と部分適用
  • Measureで単位を定義
  • Active Pattern
  • Quotation
  • アクター
途中で練習問題があり、参加者に実際にコーディングしてもらう、というシーンも。僕はカリー化あたりで理解不能となってしまった。カレーライスは好き。
今回は全体的にわからない単語が多く、ほとんどついていけなかった。ただ今後は業務アプリケーションでも並列を意識したプログラミングが必要になるケースも出てくるだろう。その時に備えて今から準備は進めて行きたい。

コメント

このブログの人気の投稿

VirtualBoxのUbuntu 18.04でNAT + ホストオンリーアダプター

VirtualBoxのVMにインストールしたUbuntu Server 18.04で、ネットワーク割当を「NAT」+「ホストオンリーアダプター」にする場合の設定についてメモ。 VMを作るとき、ゲストOSからインターネットに繋がって、かつホスト-ゲスト間でもつながる環境にしたいとき、VMのネットワーク割当は手っ取り早いのは「ブリッジアダプター」なんだけど、会社のネットワークでは都合がわるかったりするので「NAT」+「ホストオンリーアダプター」にしている。 アダプター1は「NAT」を選択 アダプター2は「ホストオンリーアダプター」を選択 ゲストOSであるUbuntuのネットワーク設定は、NATに該当するNICはDHPCで、ホストオンリーアダプターに該当するNICは固定IPとする。 Ubuntu 18.04ではネットワーク設定はNetplanで行う(Ubuntu 17.10から変わったようだ)。編集する設定ファイルは「/etc/netplan/50-cloud-init.yaml」 network: ethernets: {NATのNIC}: addresses: [] dhcp4: true optional: true {ホストオンリーアダプターのNIC}: addresses: [{固定IPアドレス}] dhcp4: no version: 2 ポイントは、ホストオンリーアダプターに該当するNICの固定アドレスを設定するときに、 ゲートウェイを設定しない こと。 以前に QiitaのVirtualBoxでNAT + Host-Only Network環境を構築する を参考にしていたのに、今回18.04で設定する際にすっかり忘れてはまってしまった。 IPアドレスは「192.168.0.2/24」のようにサブネットマスクも指定する。 NICに指定するデバイス名は以下コマンドで表示されるlogical nameが該当する。 > lshw -class network たいていは「enp0s3」「enp0s8」となるようだ。 設定ファイルを保存したら

画像を切り取って保存する

画像処理において、画像の一部を切り出すことをトリミングというらしい。画像編集ソフトなんかにも大抵「トリミング」機能が実装されているだろう。 そんな画像を切り取る処理を.NETでやってみる。 .NETでは画像を扱う際にはBitmapクラスを使用する。BitmapクラスのCloneメソッドでサイズを指定すれば、そのサイズのBitmapオブジェクトができるので、それを保存すればよい。Cloneメソッドの引数はRectangle構造体とPixelFormat列挙体。 Rectangle構造体とは四角形の位置とサイズを表したもの。元画像の左上を(0, 0)として(X座標, Y座標, 幅, 高さ)の値でRectangle構造体を作成して渡す。PixelFormat列挙体はヘルプを見てもよくわからなかった。とりあえずは元画像の値をそのまま渡す。 例えば photo by tsukacyi のようなユッケの画像をトリミングするプログラムは以下のように書ける '元画像 Dim source As Bitmap source = New Bitmap("source.jpg") '切り取るサイズ Dim rect As Rectangle rect = New Rectangle(30, 80, 400, 320) '切り取り後の画像 Dim trimed As Bitmap trimed = source.Clone(rect, source.PixelFormat) '保存 trimed.Save("trimed.jpg") source.Dispose() trimed.Dispose() トリミング後の画像は以下の通り。

Microsoft.VisualBasic.dllを参照しない(その1)

VB.NETには、VB6に実装されていたCIntなどの型変換関数やLeft、Rightなどの文字列関数が使用できる。これらはMicrosoft.VisualBasic名前空間で定義されている。 個人的にはこれらはVB6との互換性の為に用意されたものと考えていて、あまり使用しないようにしている。名前付けのガイドラインにも沿っていないため、他の.NETなメソッドと並ぶと違和感があるというのもある。 注意:このエントリはVisual Basic 2005 Express Editionと.NET Framework2.0 SDK環境を元に書いています。 そんなわけでチーム開発の場合に、これら関数を使用しないよう、Microdoft.VisualBasic.dllを参照しないプロジェクトを作成しようと考えた。 Visual Studioのプロジェクトのプロパティから「参照」タブを開いてみると、すでに参照しているdllにMicrosoft.VisualBasic.dllが含まれていない。  下の一覧にImportされる名前空間が表示されているが、そこには含まれている。 Importされる名前空間からチェックをはずし以下のソースを書いてみる Public Class VisualBasicTest Public Shared Sub Main() Dim i As Integer = CInt("1991") System.Console.WriteLine(i) End Sub End Class だが、ビルドは通って実行もできてしまう。 逆アセンブリしてみる。 スタートメニューから「Microsoft .NET Framework SDK v2.0」→「Tools」→「MSIL 逆アセンブラ」を起動して、ビルドでできているexeを開く。すると、MANIFESTの部分を見てみると下記記述が見つかる。参照しているようだ。 .assembly extern Microsoft.VisualBasic { .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) .ver 8:0:0:0 } きっとVisual Studioが