unsigned short型の配列から別のunsigned short型の配列へ、データをコピーするときに、オーバーヘッドを少なく、いかに処理時間を高速にデータをコピーするかというお話です。
たとえば↓のようなデータがあったとします。
unsigned short a[100],b[100];
配列aから配列bへどのようにしたら、高速にメモリコピーできるんでしょうか?
memcopyを使用すると一番手っ取り早いのですが、ものすごくオーバーヘッドが高いと聞きます。memcopyを行うとどのような処理をしているのでしょうか?
memcpyを使用しないなら、for文を使って
for(i=0;i<100;i++){
a[i]=b[i];
}
と私はしてしまいたいのですが、知人曰く、メモリアクセスには時間がかかるので避けたいとのことでした。
たとえば、aからbへの代入に一旦ポインタを使用して、double型でキャストして代入を行い、メモリアクセスの回数を減らして、for文のループも減らすという対策も出来るとおもいますが、一体どれが一番高速にaからbへデータをコピーできるのでしょうか?
a[100],b[100]としましたが、サイズは任意です。大きい場合もあるし、小さい場合もあります。
なにか良いアイデア&memcopyの内部処理などを知っている方いましたら、教えてください。
No.4ベストアンサー
- 回答日時:
推測ですが、インテルの石では、中心部分は大体こんな感じではないですか。
RISCチップやモトローラはわかりません。インテル一筋なもんで。MOV EAX,CS
MOV DS,EAX
MOV ES,EAX
POP SI
POP DI
POP ECX
CLD
REP
MOVSB
このソースの前後にCライブラリ特有の処理が必要になります。
ただ、関数のオーバーヘッドが気になるのでしたら、全体のアルゴリズムを見直して、データ転送ではなく、ポインタを使うようにしたほうがいいと思います。
丁寧なご回答どうもありがとうございます。
実はこのプログラムは特定機器向け用に知人がC言語で作っている最中で
高速化をはかるために、ほとんどのアルゴリズムの改良を行なったらしいです。
で、残りはこの部分のみとのことでした...。
入出力は外部かららしく、それを自分のところのどうしてもポインタを使用せず、
メモリにコピーをしたいらしいです。
memcopyを使用せずに、高速にコピーできる方法で、
なにか良いアイデアありませんか~??
あったらどうぞよろしくお願いいたします。
No.6
- 回答日時:
>実はこのプログラムは特定機器向け用に知人がC言語で作っている最中らしいです。
>先ほどその知人に聞いたところ、memcopyは使用できないとのことでした...。
memcopyも実装されてないような特定機器の話なら、こんな一般論的な質問をしても解決しないと思います。コンパイラの最適化能力もわからないし。具体的な機器名やコンパイラ名を書くと、それを知っている人なら回答できるかも。
ご回答、ありがとうございます。
実は知人からの相談なので、まったく環境がわかりません。
わかりましたら、お知らせしたいと思います。
No.5
- 回答日時:
『車輪を再発明してはいけない』
ソフトウェア工学ではよく言われる言葉ですが、その言葉には「効率を追い求めるだけのために標準ライブラリを再開発するな!」という意味が含まれます。
あえて車輪の再発明を望むならCPUのアーキテクチャ、CPUに内蔵されていないデータキャッシュのアルゴリズム、メモリBUSの仕様、仮想記憶のアルゴリズム、ページングデータセットのサイズなどなど考慮すべきポイントが山ほどあります。
少なくとも処理系依存の標準ライブラリはこれらを考慮して実装されているはずだからです。
ありがとうございます。
とりあえず、私のレベルではどうにもならなそうです。
でも、とても参考になりました。
どうもありがとうございました。
No.3
- 回答日時:
アセンブラで書くのが早くなると言う話を
聞きました。
データの形がはっきり決まっているなら
アセンブラの形の出力をつくり
それから、一つ一つの演算の速度表と
回数を見て調整するのかな?
以前、私が書いたソフトと商売用に直して使っていた
友人がそのようなことをいっていました。
でも、私はmemcpy() を使います。
この時間が問題になるなら新しいコンピュータにすれば
速度の問題はすぐ解決するからです。
それに、簡単だし!!
ご回答どうもありがとうございます。
実はこのプログラムは特定機器向け用に知人がC言語で作っている最中らしいです。
先ほどその知人に聞いたところ、memcopyは使用できないとのことでした...。
マシーンのスペックも決まっているとのことです。
memcopyを使用せずに何か良いアイデアありませんか~?
よろしくお願いします。
No.2
- 回答日時:
>memcopyを使用すると一番手っ取り早いのですが、ものすごくオーバーヘッドが高いと聞きます。
そうなんですか?
できる限り高速化されてるはずなんですけどね。
ループなんかよりずっと速いはずなんですけど。
>memcopyを行うとどのような処理をしているのでしょうか?
コンパイラ依存でしょうね。
VC++であれば、Cランタイムのソースも付属しているので中を確認することもできます。
おそらくアセンブラを使用していると思われますが。
ご回答どうもありがとうございます。
memcopyがオーバーヘッドが高いと知人が言っていたので、
本当かどうかは確かめていません。
しかし、それは依存するものだということを知れただけでも
大きな収穫です。どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
- サーバー ファイルサーバのデータのバックアップ 1 2023/03/15 10:30
- Excel(エクセル) VBA 特定の列に入っているテキストをコピペ 2 2023/06/14 11:24
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- MySQL データベースの複製の仕方(mysql) 2 2023/05/30 18:24
- Visual Basic(VBA) VBA横データを縦にしたいです 2 2023/08/08 19:38
- Visual Basic(VBA) vba 等間隔の列に対しての計算 6 2022/05/17 20:15
- Visual Basic(VBA) 2つのシートの任意のセルの番号が一致したら、一致した行をコピーする VBA 2 2023/06/19 20:48
- Visual Basic(VBA) マクロで最終行を取得したい 4 2023/05/28 12:14
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
アセンブラからC言語に変換する...
-
ライン数とステップ数の違いは?
-
エンディアンについて。
-
PICのアセンブラからC言語へ変...
-
MASMの擬似命令「ASSUME」について
-
PICはアセンブラとC言語のどち...
-
CASIOのポケコンZ-1GRのアセン...
-
CASL アセンブラ命令 アプリ機能
-
アセンブラで割り算
-
【H8マイコン】HEWで埋め込みア...
-
このアセンブラの意味を教えて...
-
0xffffとは?
-
8ビットのデータの、先頭ビット...
-
ものづくりに向いているプログ...
-
エクセルVBAのIf,Then 構...
-
符号無し整数xを右にnビット回転
-
verilog 符号付加減算(最上位...
-
delph5 ボタンの色を変更するに...
-
ビットシフトってどんな時使うの?
-
シーケンサのデータレジスタD...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ライン数とステップ数の違いは?
-
Windowsはオープンソースですか?
-
アセンブラからC言語に変換する...
-
実行ファイルからソースはみれる?
-
アセンブラ言語がわかりません。
-
アセンブラエディタ
-
PICに書き込むプログラムや変数...
-
SHの命令の意味について
-
このアセンブラの意味を教えて...
-
void __cdeclなど_
-
GCCの.cfi_系について
-
PC-9801でマシン語を学習するに...
-
アセンブラのLA
-
アセンブラで割り算
-
汎用レジスタのワーキングビッ...
-
エンディアンについて。
-
C to 68000アセンブラ
-
PICはアセンブラとC言語のどち...
-
素朴な疑問 (C言語とアセン...
-
アセンブラwordという単位
おすすめ情報