카페 질문이 있어서 찾아보니..
FPU 형태로 별도의 하드웨어로 구성되는 Floating Point Hardware라는 IP가 존재한다.
귀찮아서 custom으로 검색!
Hardware랑 Hardware 2가 있다.
2는 2 답게 +-*/(Arithmetic)과 추가적으로 다른 부동소수점 연산을 지원하는데
도표를 보면 성능이 참.. 자비가 없네 ㄷㄷ
Floating Point Hardware는 +-*는 기본으로 제공되고 /에 대해서는 별도 옵션으로 선택해야 한다.
음. VHDL only 라니.. verilog 프로젝트에서는 못쓰나? (먼가 경고 두개 뜨긴 하던데...)
그리고 2500 4-input LE 라는데 Nios2에 비하면 꽤나 큰 로직의 사용인거 같고,
4-input LE가 적은 시리즈라면 치명적일 수도 있겠다.
결정적으로(!) float 인거지 double은 미지원이다.
The characteristics of the FPH2 are:
- Supports FPH1 operations (add, sub, multiply, divide) and adds support for square root, comparisons, integer conversions, minimum, maximum, negate, and absolute
- Single-precision floating point values are stored in the Nios II general purpose registers
- VHDL only
- Platform Designer support only
- Single-precision only
- Optimized for FPGAs with 4-input LEs and 18-bit multipliers
- GCC and Nios II SBT (Software Build Tools) software support
- IEEE 754-2008 compliant except for:
- Simplified rounding
- Simplified NaN handling
- No exceptions
- No status flags
- Subnormal supported on a subset of operations
- Binary-compatibility with FPH1
- FPH1 implements Round-To-Nearest rounding. Because FPH2 implements different rounding, results might be subtly different between the two generations
- Resource consumption in a typical system:
- Approximately 2500 4-input LEs
- Nine 9-bit multipliers
- Three M9K memories or larger
성능 테이블 8비트 연산
Specifies the 8 bit fixed custom instruction for the operation. 일 경우가 N인데
연산을 위해 8비트 사용자 명령어로 사용했다는 건가?
아무튼 극단적으로 230여배 성능 향상! 이라고 뻥칠 수 있다 ㅋㅋ
안정적으로는 50배 정도 성능향상이 있을 것으로 보인다.
(물론 별도 하드웨어로 통신을 하고 하면서 순수 연산 속도에는 조금 더 낮게 측정 되겠지만)
Table 15. FPH2 Operation SummaryOperation | N | Cycles | Result | Subnormal | Rounding | GCC Inference |
---|
fdivs | 255 | 16 | a/b | flush-to-0 | Nearest | a/b |
fsubs | 254 | 5 | a-b | flush-to-0 | Faithful | a-b |
fadds | 253 | 5 | a+b | flush-to-0 | Faithful | a+b |
fmuls | 252 | 4 | a*b | flush-to-0 | Faithful | a*b |
fsqrts | 251 | 8 | sqrt(a) | flush-to-0 | Faithful | sqrtf() |
floatis | 250 | 4 | int_to_float(a) | Does not apply | Does not apply | Casting |
fixsi | 249 | 2 | float_to_int(a) | flush-to-0 | Truncation | Casting |
round | 248 | 2 | float_to_int(a) | flush-to-0 | Nearest | lroundf()11 |
reserved | 234 to 247 | Undefined | undefined | | | |
fmins | 233 | 1 | (a<b) ? a : b | supported | None | fminf()11 |
fmaxs | 232 | 1 | (a<b) ? b : a | supported | None | fmaxf()11 |
fcmplts | 231 | 1 | (a<b) ? 1 : 0 | supported | None | a<b |
fcmples | 230 | 1 | (a≤b) ? 1 : 0 | supported | None | a<=b |
fcmpgts | 229 | 1 | (a>b) ? 1 : 0 | supported | None | a>b |
fcmpges | 228 | 1 | (a≥b) ? 1 : 0 | supported | None | a>=b |
fcmpeqs | 227 | 1 | (a=b) ? 1 : 0 | supported | None | a==b |
fcmpnes | 226 | 1 | (a≠b) ? 1 : 0 | supported | None | a!=b |
fnegs | 225 | 1 | -a | supported | None | -a |
fabss | 224 | 1 | |a| | supported | None | fabsf() |
[링크 : https://www.altera.com/documentation/cru1439932898327.html]
[링크 : https://www.altera.com/documentation/cru1439932898327.html#lro1432145764151]