【发布时间】:2011-12-09 08:16:47
【问题描述】:
我目前正在为需要一些性能改进的 Java 应用程序开发 C 模块(有关背景信息,请参阅 Improving performance of network coding-encoding)。我尝试使用 SSE-intrinsics 优化代码,它的执行速度比 Java 版本快一些(~20%)。但是,它仍然不够快。
不幸的是,我在优化 C 代码方面的经验有些有限。因此,我很想获得一些关于如何改进当前实施的想法。
构成热点的内部循环如下所示:
for (i = 0; i < numberOfGFVectorsInFragment; i++) {
// Load the 4 GF-elements from the message-fragment and add the log of the coefficeint to them.
__m128i currentMessageFragmentVector = _mm_load_si128 (currentMessageFragmentPtr);
__m128i currentEncodedResult = _mm_load_si128(encodedFragmentResultArray);
__m128i logSumVector = _mm_add_epi32(coefficientLogValueVector, currentMessageFragmentVector);
__m128i updatedResultVector = _mm_xor_si128(currentEncodedResult, valuesToXor);
_mm_store_si128(encodedFragmentResultArray, updatedResultVector);
encodedFragmentResultArray++;
currentMessageFragmentPtr++;
}
【问题讨论】:
-
您查看过编译器生成的程序集吗?那里可能会有一些进一步的收获。如果您不能让编译器执行它们,请手动执行并使用(注释良好的) .s 作为源文件,而不是 .c
-
虽然在某种程度上扼杀了 Java 的“可移植性”方面。
-
@OrangeDog 我现在已将程序集添加到问题中。
-
您在生成该程序集时是否对编译器进行了任何优化?
-
@OrangeDog 是的。我使用了以下构建标志: cl /c /Zi /nologo- /Wall /WX- /Ox /Ob2 /Oi /Ot /Oy- /D WIN32 /D NDEBUG /D _WINDLL /D _UNICODE /D UNICODE /Gm- / EHsc /MD /GS /arch:SSE2 /fp:precise /Zc:wchar_t /Zc:forScope /Yc"StdAfx.h" /Fp"Release\NetworkCodingAccelerator.pch" /Fo"Release\\" /Fd"Release\vc100 .pdb" /Gd /TC /analyze- /errorReport:prompt Stdafx.c 你觉得我应该补充什么吗?在 MSVC 的编译器设置方面,我是新手。
标签: java c optimization sse intel-vtune