悲しいことに、答えはこれらの提案よりもはるかに平凡ですが、それらは役に立ちます。基本的に、私は自分がどのようにタイミングをとっていたかを台無しにしました。
私が使用していたタイミングコードは次のとおりです。
Ipp32s timer;
ippGetCpuFreqMhz(&timer);
Ipp64u globalStart = ippGetCpuClocks();
globalStart = ippGetCpuClocks() *2 - globalStart; //use this method to get rid of the overhead of getting clock ticks
//do some stuff
Ipp64u globalEnd = ippGetCpuClocks();
globalEnd = ippGetCpuClocks() *2 - globalEnd;
std::cout << "total runtime: " << ((Ipp64f)globalEnd - (Ipp64f)globalStart)/((Ipp64f)timer *1000000.0f) << " seconds" << std::endl;
このコードはインテル®コンパイラーに固有のものであり、非常に正確な時間測定を行うように設計されています。残念ながら、その極端な精度は、実行ごとに約2.5秒のコストを意味します。タイミングコードを削除すると、その時間の制約がなくなりました。
ただし、実行時間の遅延はまだあるようです。コードは、そのタイミングコードをオンにすると0.24秒を報告し、現在は約0.35秒のタイミングを報告しています。これは、約50%の速度コストがあることを意味します。
コードを次のように変更します。
static extern void ImageProcessing(
IntPtr inImage, //[MarshalAs(UnmanagedType.LPArray)]ushort[] inImage,
IntPtr outImage, //[MarshalAs(UnmanagedType.LPArray)]ushort[] outImage,
int inYSize, int inXSize);
そして次のように呼ばれます:
unsafe {
fixed (ushort* inImagePtr = theInputImage.DataArray){
fixed (ushort* outImagePtr = theResult){
ImageProcessing((IntPtr)inImagePtr,//theInputImage.DataArray,
(IntPtr)outImagePtr,//theResult,
ysize,
xsize);
}
}
}
実行可能時間を0.3秒に短縮します(3回の実行の平均)。私の好みにはまだ遅すぎますが、10倍の速度の向上は確かに私の上司の許容範囲内です。