public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "joony.wie at samsung dot com" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug c++/111306] New: macro-fusion makes error on conjugate complex multiplication
Date: Wed, 06 Sep 2023 12:18:54 +0000	[thread overview]
Message-ID: <bug-111306-4@http.gcc.gnu.org/bugzilla/> (raw)

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111306

            Bug ID: 111306
           Summary: macro-fusion makes error on conjugate complex
                    multiplication
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: joony.wie at samsung dot com
  Target Milestone: ---

It seems that the operands src1 and src2 of "_mm512_fcmul_pch" are swapped for
macro-fusion with optimize option.

If the operands are swapped, the imag value of result will have incorrect sign
bit.

So, the operands should not be swapped in these conjugate complex
multiplication intrinsics.

Let me show the example and the output.

output: 
3.000000 -4.000000 // w/o optimize.
3.000000 4.000000 // w/ optimize.

https://godbolt.org/z/df9Gz18hc // but may not executable
```
#include <immintrin.h>
#include <cstdio>

__attribute__((optimize("O0")))
auto func0(_Float16 *a, _Float16 *b, int n, _Float16 *c) {
  __m512h rA = _mm512_loadu_ph(a);
  for (int i = 0; i < n; i += 32) {
    __m512h rB = _mm512_loadu_ph(b + i);
    _mm512_storeu_ph(c + i, _mm512_fcmul_pch(rB, rA));
  }
}

__attribute__((optimize("O")))
auto func1(_Float16 *a, _Float16 *b, int n, _Float16 *c) {
  __m512h rA = _mm512_loadu_ph(a);
  for (int i = 0; i < n; i += 32) {
    __m512h rB = _mm512_loadu_ph(b + i);
    _mm512_storeu_ph(c + i, _mm512_fcmul_pch(rB, rA));
  }
}

int main() {
  int n = 32;

  _Float16 a[n], b[n], c[n];
  for (int i = 1; i <= n; i++) {
    a[i - 1] = i & 1 ? -i : i;
    b[i - 1] = i;
  }

  func0(a, b, n, c);
    for (int i = 0; i < n / 32 * 2; i++) {
      printf("%f ", (float)c[i]);
    }
    printf("\n");

  func1(a, b, n, c);
    for (int i = 0; i < n / 32 * 2; i++) {
      printf("%f ", (float)c[i]);
    }
    printf("\n");

  return 0;
}
```

             reply	other threads:[~2023-09-06 12:18 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-09-06 12:18 joony.wie at samsung dot com [this message]
2023-09-08  2:18 ` [Bug target/111306] [12,13] macro-fusion makes error on conjugate complex multiplication fp16 pinskia at gcc dot gnu.org
2023-09-08  2:19 ` pinskia at gcc dot gnu.org
2023-09-08  3:24 ` crazylht at gmail dot com
2023-09-08  6:02 ` crazylht at gmail dot com
2023-09-11  1:17 ` cvs-commit at gcc dot gnu.org
2023-09-11  1:20 ` cvs-commit at gcc dot gnu.org
2023-09-11  1:22 ` cvs-commit at gcc dot gnu.org
2023-09-11  1:23 ` crazylht at gmail dot com
2023-09-12 11:09 ` rguenth at gcc dot gnu.org

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bug-111306-4@http.gcc.gnu.org/bugzilla/ \
    --to=gcc-bugzilla@gcc.gnu.org \
    --cc=gcc-bugs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).