2016-11-06 3 views
1

私は現在、C++を使っていくつかのDSPアルゴリズムを実装しようとしていますが、私が効率的であるかどうかについて興味があります。DSPアプリケーション用のstd :: vectorオブジェクトを使用するのは効果がありませんか?

私は、一連の入力が与えられたときにフィルタリングされた出力を生成する 'DigitalFilter'クラスを設計しようとしています。今私が直面している問題は、フィルタのサイズ(すなわち、フィルタ係数の数)が変化し得ることである。したがって、DigitalFilterクラスインスタンスのサイズは異なります。例えば、DigitalFilterの1つのインスタンスは、4つのフィルタ係数を保持する必要があり、別のインスタンスは90のフィルタ係数を保持する必要があります。

これらの係数を保持する明白で簡単な方法は、std :: vectorオブジェクトを使用してこれらの係数を保持することです。このオブジェクトは本質的にサイズが変わる可能性があり、私のアプリケーションには適しているようです。

しかし、私はヒープ割り当てメモリ(スタックメモリとは対照的に)を使用して実装されていることも知っています。したがって、フィルタを設定し、それを使用して数学的に集中的な計算を行うと、ヒープデータを常に参照しています。私は、ベクトルに関連する一般的なコストは、ベクトルが大きすぎてメモリの元の場所に収まらない場合にメモリの場所を完全に再配置する必要があることを認識していますが、フィルタリング操作が開始される前にサイズが調整されます。しかし、私はまだ効率が不思議です。

私の質問:ヒープデータとスタックデータの参照にはどのような時間がかかるでしょうか?プロセッサのキャッシュメモリが高速アクセスのためにこのヒープデータを保持する可能性はありますか?

+3

プロセッサキャッシュは、スタックまたはヒープに関係なく、最も頻繁にアクセスしているものに保持されます。差をつけるべき唯一のことは、あなたがアクセスしているものがメモリに緊密に詰まっているかどうかです。 –

+0

@ MarkRansomあなたと100%一致します。 [私の答え](http://stackoverflow.com/a/40451860/4433386)で少しの経験で拡張されました。 –

答えて

3

ヒープメモリとスタックメモリのアクセス時間は、どの標準PCハードウェアでも同じです。

あなたのフィルタリングアルゴリズムでベクトルのサイズを変更していないので、あなたがそれを作成するとき、あなたはベクトルの大きさを指定することができます。

std::vector<int> coef(90); 

また、直接、配列を使用することができます。

int * coef = new int[90]; 
+0

"ヒープメモリとスタックメモリのアクセス時間は、どの標準のPCハードウェアでも同じです。" - あなたはそれをどのように正確に知っていますか?著者がヒープ検索がスタック検索よりも遅いと言う複数の参照に出くわしたようです。これは公式な情報源ではないことに気がついていますが、このようなチュートリアルではこれを述べているようです - http://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html何がありますか? – Izzo

+0

@Teague [my answer](http://stackoverflow.com/a/40451860/4433386)を参照してください。ヒープと呼ばれるものとスタックと呼ばれるものの違いを生み出すアーキテクチャは何もありません。実際、これらの2つの違いは、実際にはあなたが思うよりはるかに厳格ではありません。 –

+1

、@Teague、あなたのhttp://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.htmlは間違っています。インターネット上のすべてが正確ではありません! –

3

あなたの意見はわかりません。 のDSPのデータを扱うことは完全に可能であるだけでなく、一般的に行われています。たとえば、GNU Radioとその高度に最適化されたDSPプリミティブライブラリlibVOLKは、広範にベクトルを使用します。

ヒープとスタックのメモリが異なって動作することを示唆している非常に奇妙な文献がたくさんあります。これは、私が作業しているプラ​​ットフォーム(x86、x86_64、ARMv7、H8300に限定されています) )これらを無視しても問題ありません。

メモリはメモリで、CPUのメモリコントローラ/キャッシュコントローラは、最後に使用されたもの/最も頻繁に使用されたものをローカルに保持します。あなたのメモリモデルがシーケンシャルである限り(Bjarne Stroustrup氏は、「あなたのデータ構造を知らないが、私のベクトルが駄目になるだろう」との素敵なプレゼンテーションを開催しています)、あなたのCPUキャッシュはローカルに保持しますあなたがそれにアクセスすれば。

+0

一部のプロセッサでは、スタックの最上部に近い場所の命令が短い可能性があります。しかし、命令帯域幅は、長い間、現代のアーキテクチャではボトルネックではありませんでした。 –

+0

@ MarkRansom私はそれについて多くのことを疑問に思っていました:http://stackoverflow.com/q/40455750/4433386 –

関連する問題