- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hey everyone,
I couldn't find any old topics that dealt with this question in detail, so here I am asking it again: is there a way to enable FMA math when using the MKL routines? Here is a sample routine that when run on MSVC 2017 with the latest MKL version (details in the output below) and an AVX2 processor DOES NOT use FMA:
void print_mkl_info() { MKLVersion Version; mkl_get_version(&Version); printf("Major version: %d\n",Version.MajorVersion); printf("Minor version: %d\n",Version.MinorVersion); printf("Update version: %d\n",Version.UpdateVersion); printf("Product status: %s\n",Version.ProductStatus); printf("Build: %s\n",Version.Build); printf("Platform: %s\n",Version.Platform); printf("Processor optimization: %s\n",Version.Processor); printf("================================================================\n"); printf("\n"); } float standard_dot_product(float* a, float* b) { float c = 0.0f; for (int i = 0; i < 4; i++) { c = c + (a * b); } return c; } float standard_fma_dot_product(float* a, float* b) { float c = 0.0f; for (int i = 0; i < 4; i++) { c = fmaf(a, b, c); } return c; } float mkl_dot_product(float* a, float* b) { return cblas_sdot(4, a, 1, b, 1); } int main() { print_mkl_info(); float a[4] = { 1.907607, -.7862027, 1.148311, .9604002 }; float b[4] = { -.9355000, -.6915108, 1.724470, -.7097529 }; printf("Standard dot product is: %.23f\n", standard_dot_product(a, b)); printf("Standard FMA dot product is: %.23f\n", standard_fma_dot_product(a, b)); printf("MKL dot product is: %.23f\n", mkl_dot_product(a, b)); return 0; }
The above program outputs (compiled with FP:FAST and O2. Note that changing O2 to O1 changes the result of the standard_dot_product function, but not of the CBLAS routine):
Major version: 2019 Minor version: 0 Update version: 2 Product status: Product Build: 20190118 Platform: 32-bit Processor optimization: Intel(R) Advanced Vector Extensions 2 (Intel(R) AVX2) enabled processors ================================================================ Standard dot product is: 0.05768233537673950195313 Standard FMA dot product is: 0.05768235772848129272461 MKL dot product is: 0.05768233537673950195313
So is there anyway to generate results with FMA in such cases? Or am I being a knobhead and missing something?
THANKS!
Swat
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Your CPU already supports FMA instructions because of AVX2 code branch has been called.
You may also try to play mkl_enable_instructions(int) to dispatch for another instruction sets.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Gennady F. (Intel) wrote:Your CPU already supports FMA instructions because of AVX2 code branch has been called.
You may also try to play mkl_enable_instructions(int) to dispatch for another instruction sets.
You were right; my processor does have FMA support, but it looks like that branch is called only when compiled under 64-bit mode. There is a slight difference in the answers though (printed out as integer values for easy comparison, compiled on MSVC 19.11.25507.1 for x64, with /arch:AVX2 and /O2):
Standard dot product is: 1030505552 Standard FMA dot product is: 1030505558 MKL dot product is: 1030505568
Would you happen to know why this difference occurs?
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page