[1] 授業単元:画像処理とC言語
[2] 問題文(含コード&リンク):
メモリ上に64バイトのデータがあります。これは4x16の行列です。
char buf[16][4] = { a0, b0, c0, d0, ... , a15, b15, c15, d15 };
組込関数を用いてxmmレジスタに4分割して読込みました。中のイメージはこうです。
__m128i t0 = { a0 , b0 , c0 , d0 , ... , a3 , b3 , c3 , d3 };
__m128i t1 = { a4 , b4 , c4 , d4 , ... , a7 , b7 , c7 , d7 };
__m128i t2 = { a8 , b8 , c8 , d8 , ... , a11, b11, c11, d11 };
__m128i t3 = { a12, b12, c12, d12, ... , a15, b15, c15, d15 };
ここから16x4の転置行列を得ましょう。内容のイメージはこうです。
__m128i r0 = { a0, ... , a15 };
__m128i r1 = { b0, ... , b15 };
__m128i r2 = { c0, ... , c15 };
__m128i r3 = { d0, ... , d15 };
禁じ手
r0 = _mm_set_epi8(buf[15][0], buf[14][0], ... , buf[0][0]);
こういう遅いプログラムはダメです。xmmレジスタの操作でカタを付けましょう。
[3] 環境
[3.1] OS: Windows XP
[3.2] コンパイラ名とバージョン:GCC 4.4.1
[3.3] 言語:C言語
[4] 期限:2009年12月18日 12:00:00まで
[5] その他の制限:SSE〜SSE3の組込命令を使って良い。