2013年2月17日日曜日

cudaMallocの速度

cudaMallocに要する時間の測定結果.

環境

  • windows 8 64bit
  • visual c++ 2010 express
  • cuda 5.0
  • intel core-i5 3317 1.70GHz
  • GeForce GT 620M
  • cudaMallocとcudaFreeだけ,転送はしない
結果

  • 0.3msec / cudaMalloc()
  • サイズ4Mくらいまでは一定時間と考えてよい
  • 大規模な処理なら無視できるが,時間にシビアな用途(画像処理など,1/60=16.7msecで作業を終わらせる必要があるなど)では,複数回実行すると実行時間に影響を与えるレベル.



2013年2月14日木曜日

typedefされている型が,同じかどうか調べる

typedefされている型が,同じかどうか調べる.
typeidを使う.
typeinfoをインクルードする.


#include <iostream>
#include <typeinfo>
typedef int type_a;
typedef int type_b;
typedef short type_c;
int main(int argc, char **argv)
{
  if (typeid(type_a) == typeid(type_b)) {
    std::cout << "same" << std::endl;
  } else {
    std::cout << "different" << std::endl;
  }
  if (typeid(type_a) == typeid(type_c)) {
    std::cout << "same" << std::endl;
  } else {
    std::cout << "different" << std::endl;
  }
  return 0;
}

2013年2月11日月曜日

Visual C++ でwarningの抑制

ソース単位:
#pragma warning(disable: 4819)
プロジェクト単位:
プロジェクトのプロパティ > 構成プロパティ > C/C++ > 詳細設定 > 指定の警告を無効にする に番号を指定

2013年2月10日日曜日

STLのfor_each

お題: std::vector<std::list<int> > の,std::list<int> の要素を全て削除する.

std::for_each() を使えばよろしい,と思った.

以下,ダメな例:
#include <algorithm>
#include <list>
#include <vector>

void clear(std::list<int> l)
{
  l.clear();
}

int main(int argc, char **argv)
{
  std::vector<std::list<int> > data;

  /* snip */

  std::for_each(data.begin(), data.end(), clear);

  /* snip */

  return 0;
}
以下,動く例:
#include <algorithm>
#include <list>
#include <vector>

void clear(std::list<int> &l)
{
  l.clear();
}

int main(int argc, char **argv)
{
  std::vector<std::list<int> > data;

  /* snip */

  std::for_each(data.begin(), data.end(), clear);

  /* snip */

  return 0;
}
どこが違うか? for_eachの引数として与える関数の引数を参照渡しにするかどうか,だけ.しかも,宣言部のみ.また値渡しの方は,全要素コピーが発生している? 気をつけよう.

追記: しかしながら,メンバ関数をfor_eachの第3引数にする場合は,bind1st と mem_ref を使うのが定石らしく,かつ,参照呼び出しは,boostまで導入せねばならないようだ.読んだだけで未確認.
http://hippos-lab.com/blog/node/319
そこまでせなあかんのやったら,もう明示的にループまわすわ...

2013年2月1日金曜日

同じ実行ファイルがcygwinにもある

ある実行ファイルについて,cygwinに同じ名前の実行ファイルが存在する場合に,cygwin外を優先して実行するには,PATHの設定を.bach_profile中で以下のように行う(例はpythonとtexlive).

export PATH=/cygdrive/c/Python27:/cygdrive/c/texlive/2012/bin/win32:$PATH

TeXで条件分岐

ifthenパッケージを用いると実現できる.
以下の例では,ColorFiguresを1にすると「color」,1以外にすると「mono」と表示される.
\documentclass{jarticle}
\usepackage{ifthen}

\def\ColorFigures{0}

\begin{document}

\ifthenelse{\equal{\ColorFigures}{1}}{color}{mono}

\end{document}