現在、できるだけ速く、距離計算を行いたいと考えています。
具体的には、8bit符号なし整数列の距離計算です。
SSEを利用するのが速いので、 _mm_sad_epu8()を使って組みました。
確かに高速に動作しておりますが、
本当はSAD(絶対誤差の総和)ではなく、SSD(2乗誤差の総和)を求めたいのです。
8bitの符号なし整数列を32bitの符号付き整数列に置き換えてから、
計算するのだとは思いますが、どのように組めば効率が良いのか分かりません。
計算の流れは、
・8bit→32bit
・32bit整数列の差分
・32bit整数列の乗算(2乗)
・32bit整数列の総和
となると思いますが、
8bit→32bitを行う関数も見当たらないですし、
符号付き32bit整数列の乗算関数も見当たりません。
どなたかご存知であれば、教えていただけると幸いです。
No.1ベストアンサー
- 回答日時:
こんにちは。
かじり程度で、mmx/sseを使用した事があるだけなのですが・・・。一応お話だけでも。
乗算の方は色々有りすぎて、分からないのですが、
>>8bit→32bitを行う関数
の方は pinsrw と言う命令が、xmm/mmレジスタの任意の場所に向かってデータを置けるので、其れを利用して並べると言うのなら出来ます。
対応する関数は、
PINSRW __m64 _mm_insert_pi16 (__m64 a, int d, int n)
PINSRW __m128i _mm_insert_epi16 ( __m128i a, int b, int imm)
ですが、ストレートに書いてしまった方が楽だと思います。
アラはあるとは思いますが、其処は勘弁です。本当に早いかどうかは不明です・・・。
// simdblast.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
#include "stdafx.h"
#include "emmintrin.h"
__m128i ui8_to_i32(const unsigned __int8 buf_i8[4])
{
__declspec(align(16)) __m128i mem;
__asm
{
//pushad
xor ecx, ecx
mov esi, buf_i8
mov eax, [esi]
mov cl, al
pinsrw xmm0, ecx, 0
mov cl, ah
pinsrw xmm0, ecx, 2
shr eax, 16
mov cl, al
pinsrw xmm0, ecx, 4
mov cl, ah
pinsrw xmm0, ecx, 6
movaps mem, xmm0
//movups mem, xmm0
//popad
emms
}
return mem;
}
int _tmain(int argc, _TCHAR* argv[])
{
__declspec(align(16)) __m128i a = {5,6,7,8};
__declspec(align(16)) __m128i b = {1,2,3,4};
::printf("1バイト\n");
for(int i = 0; i < 4; ++i)
{
::printf("[a : %d][b : %d]\n", a.m128i_u8[i], b.m128i_u8[i]);
}
//8bit→32bitへ変換
a = ::ui8_to_i32(a.m128i_u8);
b = ::ui8_to_i32(b.m128i_u8);
::printf("4バイト\n");
for(int i = 0; i < 4; ++i)
{
::printf("[a : %d][b : %d]\n", a.m128i_i32[i], b.m128i_i32[i]);
}
return 0;
}
御礼が遅くなって申し訳ありません。
ソースまで紹介していただき非常に助かりました。
何とか組めそうです。
本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Visual Studio Code 関数の使い方について 3 2023/05/31 13:15
- Visual Basic(VBA) VBAでArrayListを使う為の「mscorlib.tlb」の参照設定について 3 2022/03/23 19:45
- Excel(エクセル) Excel 2019 32-bit版を64-bit版にするには? 8 2023/07/28 14:20
- 英語 英文和訳についての質問です。 2 2023/06/23 06:38
- その他(AV機器・カメラ) オーディオインターフェイスの24bitなど量子化bit数はどこで設定できるのでしょうか? 1 2022/06/26 07:58
- C言語・C++・C# C言語 3 2022/10/04 15:07
- TOEFL・TOEIC・英語検定 bitとlittleは両方ともに同じ 1 2022/08/10 13:03
- その他(プログラミング・Web制作) パイソンのプログラミングについての質問です 2 2023/05/22 12:39
- 情報処理技術者・Microsoft認定資格 0xFD30 2バイトの16進数表現です。 この表現の符合付整理の値を求めなさいという問題です。 調 5 2022/07/08 13:57
- Excel(エクセル) SUMIF関数について 4 2023/06/14 13:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「指定されたキャストは有効で...
-
複数桁10進数の*桁目だけを抽出...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語での引数の省略方法
-
【C++】関数ポインタの使い方
-
比較回数と交換回数表示について
-
C言語で三目並べをするプログラ...
-
if と配列の組み合わせ
-
商と剰余を同時に求める(C言語)
-
C言語での奇数の和
-
ラップ関数とはどんなものですか?
-
Arduinoのプログラムにエラーが...
-
C言語
-
並列プログラミングのπ計算につ...
-
C言語 エラーの原因がわからな...
-
インライン展開されているか確...
-
GlobalAllocの変数を関数に引き...
-
HANDLEて何ですか?
-
read関数をノンブロッキングで...
-
C++でvectorにテキストファイル...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
「指定されたキャストは有効で...
-
C言語 配列と関数の練習問題
-
複数桁10進数の*桁目だけを抽出...
-
(int *)の意味
-
if と配列の組み合わせ
-
ラップ関数とはどんなものですか?
-
卒業研究でよく分からないとこ...
-
【C++】関数ポインタの使い方
-
c言語
-
足して100になるような乱数のア...
-
C言語初心者です、、、お助けく...
-
数字列を3桁ごとにカンマで区切...
-
C言語 エラーの原因がわからな...
-
実数の整数部,小数部の取得
-
課題でつまってます・・・
-
商と剰余を同時に求める(C言語)
-
C言語の配列をC++のvectorに高...
-
std::set<int> で、ある値が何...
おすすめ情報