tf.signal.ifft2d` / `tf.signal.irfft` produce different CPU vs GPU NaN propagation for small `complex64` inputs containing `Inf

Ouverte
#128,957 1 commentaire 0 réactions 1 personne assignée Voir sur GitHub

Les mainteneurs répondent en général sous 2 jours

@Kayyuri y travaille déjà.

Depuis le 13/10/2026.

Évaluation

Cette issue n'a pas encore été évaluée.

Description

2.20.0 comp:ops type:bug
Issue type

Bug

Have you reproduced the bug with TensorFlow Nightly?

Yes

Source

source

TensorFlow version

2.20.0

Custom code

Yes

OS platform and distribution

No response

Mobile device

No response

Python version

3.11.14

Bazel version

No response

GCC/compiler version

No response

CUDA/cuDNN version

No response

GPU model and memory

No response

Current behavior?

For small complex64 FFT inputs containing Inf, TensorFlow CPU and GPU produce different NaN propagation patterns.

Two examples are stable in three isolated runs:

  • tf.signal.ifft2d([[inf+0j, 1+0j], [2+0j, 3+0j]])
    • CPU imaginary components are finite zeros.
    • GPU imaginary components are all NaN.
    • NumPy matches the TensorFlow CPU pattern.
  • tf.signal.irfft([1+2j, inf+0j, -4+0j])
    • CPU returns [inf, 1.25, -inf, 1.25].
    • GPU returns [inf, nan, -inf, nan].
    • NumPy matches the TensorFlow CPU pattern.

A stronger non-finite control, tf.signal.irfft([1+2j, inf-3j, -4+infj]), returns all NaN on CPU, GPU, and NumPy, so the issue is not that all non-finite FFT outputs are being flagged as wrong.

Expected behavior

If TensorFlow considers CPU and GPU FFT non-finite propagation to have the same semantic contract, these small inputs should produce consistent NaN/Inf patterns across devices.

If backend-specific non-finite propagation is expected for FFT kernels, it would be helpful for the documentation or error notes to make that explicit. I am filing this as a CPU/GPU consistency issue rather than a strict finite-value correctness claim.

Standalone code to reproduce the issue
import numpy as np
import tensorflow as tf

print("TensorFlow:", tf.__version__)
print("GPUs:", tf.config.list_physical_devices("GPU"))

def run(device):
    with tf.device(device):
        a = tf.constant(
            np.array(
                [[np.inf + 0j, 1 + 0j], [2 + 0j, 3 + 0j]],
                dtype=np.complex64,
            )
        )
        b = tf.constant(
            np.array([1 + 2j, np.inf + 0j, -4 + 0j], dtype=np.complex64)
        )
        c = tf.constant(
            np.array([1 + 2j, np.inf - 3j, -4 + np.inf * 1j], dtype=np.complex64)
        )
        return {
            "ifft2d": tf.signal.ifft2d(a).numpy(),
            "irfft": tf.signal.irfft(b).numpy(),
            "irfft_control": tf.signal.irfft(c).numpy(),
        }

cpu = run("/CPU:0")
gpu = run("/GPU:0")

np_ifft2d = np.fft.ifft2(
    np.array([[np.inf + 0j, 1 + 0j], [2 + 0j, 3 + 0j]], dtype=np.complex64)
)
np_irfft = np.fft.irfft(
    np.array([1 + 2j, np.inf + 0j, -4 + 0j], dtype=np.complex64)
)
np_control = np.fft.irfft(
    np.array([1 + 2j, np.inf - 3j, -4 + np.inf * 1j], dtype=np.complex64)
)

for name in ["ifft2d", "irfft", "irfft_control"]:
    print("\n", name)
    print("CPU:", cpu[name])
    print("GPU:", gpu[name])

print("\nNumPy ifft2d:", np_ifft2d)
print("NumPy irfft:", np_irfft)
print("NumPy control:", np_control)
Relevant log output
TensorFlow: 2.20.0

ifft2d
CPU: [[inf+0.j inf+0.j]
      [inf+0.j inf+0.j]]
GPU: [[inf+nanj inf+nanj]
      [inf+nanj inf+nanj]]

irfft
CPU: [ inf  1.25 -inf  1.25]
GPU: [ inf  nan -inf  nan]

irfft_control
CPU: [nan nan nan nan]
GPU: [nan nan nan nan]

NumPy ifft2d: [[inf+0.j inf+0.j]
               [inf+0.j inf+0.j]]
NumPy irfft: [ inf  1.25 -inf  1.25]
NumPy control: [nan nan nan nan]
Langage dominant
C++
Étoiles
201k
Forks
78.4k
Merge moyen
3 j 2 h
PR mergées (30 j)
452

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de tensorflow/tensorflow

Toutes les issues de tensorflow/tensorflow

Issues similaires

Plus d'issues C++

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.