Loading...
Searching...
No Matches
metal.hpp
Go to the documentation of this file.
1#pragma once
2
3/**
4 * MetalGPUFFTGrid — GPUFFTGrid implementation for Apple Silicon.
5 *
6 * FP64 transforms delegate to the internal SerialFFTGrid (CPU FFTW),
7 * since Metal has no FP64 compute.
8 *
9 * FP32 transforms use Accelerate vDSP (native single-precision FFT on
10 * the AMX coprocessor) when grid dimensions are powers of 2. Otherwise,
11 * falls back to the FP64 upcast/downcast approach via FFTW.
12 *
13 * Implementation is in metal.mm to avoid leaking Accelerate headers
14 * into consumers.
15 */
16
19
20#include <memory>
21#include <vector>
22
23namespace q3 {
24namespace gpu {
25
27 public:
29 std::shared_ptr<execution::gpu::device::GPUDeviceBackend> device_backend = nullptr);
30
31 ~MetalGPUFFTGrid() override;
32
33 // ── FFTGrid base interface (delegated to serial_fft_grid_) ───────────
34
35 void init(int dimension_1,
36 int dimension_2,
37 int dimension_3,
38 bool use_measured_planning = false) override;
39
40 [[nodiscard]] int grid_dimension_1() const override;
41 [[nodiscard]] int grid_dimension_2() const override;
42 [[nodiscard]] int grid_dimension_3() const override;
43 [[nodiscard]] int total_grid_points() const override;
44 [[nodiscard]] int local_grid_points() const override;
45 [[nodiscard]] int local_offset() const override;
46
47 void forward(Complex* data) const override;
48 void inverse(Complex* data) const override;
49 void inverse_raw(Complex* data) const override;
50
51 [[nodiscard]] int
52 g_vector_to_fft_grid_index(int miller_1, int miller_2, int miller_3) const override;
53 void reduce_g_space(Complex* data, int number_of_elements) const override;
54 Complex* input_buffer() const override;
55 Complex* output_buffer() const override;
56 void execute_inverse_raw_on_buffers() const override;
57 void execute_forward_on_buffers() const override;
58 void prepare_forward_from_output() const override;
59
60 // ── FP32 single-precision FFT ────────────────────────────────────────
61
62 void forward_single(ComplexSingle* data) const override;
63 void inverse_raw_single(ComplexSingle* data) const override;
64
65 private:
66 SerialFFTGrid serial_fft_grid_;
67
68 // PIMPL to hide vDSP/Accelerate types from consumers
69 struct VDSPState;
70 std::unique_ptr<VDSPState> vdsp_state_;
71};
72
73} // namespace gpu
74} // namespace q3
execution::gpu::device::GPUDeviceBackend & device_backend()
Definition init.hpp:162
void execute_inverse_raw_on_buffers() const override
MetalGPUFFTGrid(std::shared_ptr< execution::gpu::device::GPUDeviceBackend > device_backend=nullptr)
Complex * input_buffer() const override
void reduce_g_space(Complex *data, int number_of_elements) const override
Complex * output_buffer() const override
void init(int dimension_1, int dimension_2, int dimension_3, bool use_measured_planning=false) override
int grid_dimension_3() const override
void forward(Complex *data) const override
void inverse_raw_single(ComplexSingle *data) const override
void prepare_forward_from_output() const override
int grid_dimension_1() const override
void inverse_raw(Complex *data) const override
void inverse(Complex *data) const override
int g_vector_to_fft_grid_index(int miller_1, int miller_2, int miller_3) const override
int total_grid_points() const override
void forward_single(ComplexSingle *data) const override
void execute_forward_on_buffers() const override
int local_offset() const override
int local_grid_points() const override
int grid_dimension_2() const override
std::complex< float > ComplexSingle
std::complex< double > Complex