What Cross-Platform GPU Performance Portability Requires

Source-level portability is not performance portability. Competitive speed across GPU vendors needs architecture-aware abstraction and per-target tuning.

What Cross-Platform GPU Performance Portability Requires
Written by TechnoLynx Published on 26 Apr 2026

Why is portable performance so much harder than portable code?

An OpenCL or SYCL kernel compiles and runs on NVIDIA, AMD, and Intel GPUs. The same source code, multiple hardware targets, one binary per target. This is source-level portability, and it generally works — the code compiles and produces correct results. What does not work is the assumption that a kernel which performs well on one GPU architecture will perform comparably on another. A kernel optimised for NVIDIA’s warp size, shared memory architecture, and cache hierarchy may achieve 60% of peak on an NVIDIA A100 and 15% of peak on an AMD MI300X — not because the AMD hardware is weaker, but because the kernel’s implementation choices are mismatched to AMD’s compute unit architecture.

Cross-platform GPU performance portability — achieving competitive (not identical, but competitive) performance across multiple GPU architectures from the same codebase — is an engineering discipline. It requires understanding the architectural differences between GPU vendors, designing abstractions that expose tuning parameters per architecture, and maintaining per-target optimisation configurations within a single source tree.

Benchmark suites paint a consistent picture, though the specific numbers vary by workload and configuration. SYCL code typically achieves near-native performance on the vendor’s own hardware (Intel GPUs via DPC++), but published results on other vendors’ hardware via translation backends are typically lower, depending on kernel complexity. The HPC community has developed performance portability metrics that consistently show indices well below 1.0 for cross-vendor workloads — in our experience across cross-platform GPU engagements, achieving 40–80% of peak across architectures is typical for scientific computing workloads that have not been explicitly tuned per target (an observed range, not a universal industry rate). These ranges are indicative, not a universal industry rate — the actual portability index for a specific workload depends on its memory access patterns, parallelism structure, and use of hardware-specific features.

Where the architectures diverge

The fundamental parallel processing model is similar across vendors: thousands of lightweight threads grouped into execution units, a hierarchy of memory (registers, shared/local memory, caches, global memory), and hardware schedulers that manage thread execution. The specifics diverge in ways that affect kernel performance:

Execution width. NVIDIA GPUs execute threads in warps of 32. AMD GPUs execute in wavefronts of 32 or 64 (architecture-dependent: RDNA uses 32, CDNA uses 64). Intel Arc GPUs use subgroups of 8, 16, or 32 depending on the configuration. Code that assumes a specific execution width — using warp-shuffle operations, warp-level reductions, or warp-synchronous programming — will produce incorrect results or degraded performance on hardware with a different width.

Memory hierarchy. NVIDIA GPUs have a configurable L1/shared memory split per streaming multiprocessor. AMD GPUs have a fixed LDS (Local Data Share) per compute unit with a separate L1 cache. Intel GPUs have a shared local memory with a different capacity and access latency profile. A kernel that is tuned for NVIDIA’s shared memory size (48KB or 96KB configurable) may not fit in AMD’s LDS (64KB fixed) or may underutilise Intel’s shared local memory.

Scheduling model. NVIDIA hardware schedules warps at the SM level with implicit warp synchrony within a scheduling group. AMD hardware schedules wavefronts with a different latency hiding strategy. Intel hardware uses a thread-level scheduling model within the EU (Execution Unit). Kernels that rely on implicit scheduling assumptions — such as assuming warps within a block execute in a particular order — may behave differently across vendors.

Instruction set and throughput. FMA throughput, special function unit availability, and integer-to-floating-point throughput ratios differ across architectures. An optimised kernel on NVIDIA may use instructions (e.g., __shfl_down_sync, __ballot_sync) that have no direct equivalent on AMD or Intel, requiring alternative implementations.

The API choice between CUDA, OpenCL, and SYCL determines which of these differences are visible to the programmer and which are abstracted away. CUDA exposes NVIDIA-specific features directly. OpenCL and SYCL abstract the hardware, but the abstraction does not eliminate the performance impact of architectural differences — it only hides the details that cause them.

Architecture-aware abstraction: the design pattern

The design pattern for portable performance is architecture-aware abstraction: a codebase that uses compile-time or runtime configuration to adapt kernel parameters to the target architecture, without duplicating the core algorithm.

Parameterised tile sizes. Instead of hard-coding a tile size of 32×32 (optimal for NVIDIA shared memory), the tile size is a compile-time parameter that is set per target — these are configuration values, not a benchmarked rate: 32×32 for NVIDIA, 64×16 for AMD CDNA (to match the 64-wide wavefront), 16×16 for Intel. The core algorithm is identical; the tiling parameters are architecture-specific.

Execution width abstraction. Instead of calling warp-specific intrinsics (__shfl_down_sync on NVIDIA), the codebase uses a subgroup abstraction that maps to warps on NVIDIA, wavefronts on AMD, and subgroups on Intel. SYCL provides this abstraction natively through sycl::sub_group. OpenCL 2.0+ provides subgroup operations. The abstraction layer dispatches to the vendor-specific implementation at compile time.

Memory configuration strategy. The kernel’s shared memory usage is parameterised to fit within the target architecture’s shared memory capacity. On NVIDIA hardware with configurable L1/shared memory, the configuration is set to maximise shared memory. On AMD with fixed LDS, the kernel’s shared memory allocation is constrained to the LDS capacity. The allocation strategy is a per-target build configuration, not a runtime decision.

Kernel selection. For operations where the optimal algorithm differs across architectures — not just the parameters, but the approach — the codebase maintains multiple kernel implementations and selects the appropriate one based on the target. A reduction operation might use warp shuffles on NVIDIA, wavefront operations on AMD, and a different tree reduction on Intel. The selection logic is part of the build system, not the runtime.

The testing infrastructure for portable performance

Portable performance requires testing on every target platform. In our experience across cross-platform GPU engagements, a kernel that compiles and produces correct results on all targets may perform 3× slower on one target than another (an observed range, not a guaranteed outcome) — and the performance difference is not visible in correctness testing.

We recommend a performance testing infrastructure that:

  • Runs a benchmark suite on each target architecture after every code change that affects kernel code
  • Compares achieved throughput against architecture-specific performance targets (expressed as a fraction of theoretical peak, not as absolute numbers — because the absolute peak differs across architectures)
  • Flags regressions on any target architecture, even if other targets improved

This infrastructure is the practical enforcement of portability. Without it, the codebase will drift toward optimisation for the developer’s primary test hardware and regress on other targets — because the regression is invisible without measurement.

A reproducible cross-platform benchmark protocol

The following protocol produces fair, reproducible performance comparisons across GPU architectures. We use this structure in our own cross-platform validation work:

  1. Select a representative workload and fix the inputs. Choose a single model and dataset that reflect your production workload (e.g., ResNet-50 inference on a 1,000-image validation set, or a GEMM of fixed dimensions). Use identical input data across all platforms — store it in a portable format (NumPy .npy or raw binary) to eliminate data-loading variance.
  2. Pin the software environment per target. Record the exact compiler, driver, and runtime versions for each platform (e.g., CUDA 12.4 + cuDNN 9.1 on NVIDIA, ROCm 6.1 + MIOpen on AMD, oneAPI 2024.1 on Intel). Use containers (Docker or Singularity) to freeze the environment so the benchmark is reproducible months later.
  3. Run warm-up iterations and discard them. Execute 10–50 warm-up iterations before measurement to ensure caches are populated, JIT compilation (if any) has completed, and GPU clocks have stabilised to their sustained frequency. Do not include warm-up iterations in the reported timing.
  4. Collect timing over a fixed number of measurement iterations. Run at least 100 measurement iterations (more for sub-millisecond kernels). Use device-side timing (CUDA Events, hipEvent_t, or SYCL profiling events) rather than host-side wall-clock timing to exclude host overhead and driver latency.
  5. Report median and percentile statistics, not the mean. Record the median, 5th percentile, and 95th percentile of per-iteration times. The median is robust to outliers from thermal throttling or OS scheduling interference. Report the coefficient of variation — as a planning heuristic from our engagements, if it exceeds 5%, investigate the source of variance before drawing conclusions.
  6. Normalise results to each platform’s theoretical peak. Express performance as a percentage of each GPU’s theoretical peak throughput (compute TFLOPS or memory bandwidth GB/s, whichever is the binding resource). This separates optimisation quality from raw hardware capability — in our experience across cross-platform GPU engagements, a kernel achieving 70% of peak on both NVIDIA and AMD is well-optimised on both (an observed pattern, not a guaranteed outcome), even if the absolute throughput differs.
  7. Automate and version-control the entire protocol. Store the benchmark script, environment specifications, input data checksums, and result-parsing logic in version control alongside the kernel source. Use a CI job (e.g., GitHub Actions with self-hosted runners per GPU type) to run the benchmark on every kernel code change and flag regressions against per-target performance baselines.

When portability is not worth the cost

Cross-platform performance portability has real engineering costs: the abstraction layer adds complexity, per-target tuning adds maintenance burden, and multi-platform testing adds infrastructure cost. These costs are justified when the software must run on multiple GPU vendors — products deployed on customer hardware, cloud workloads that span providers, or organisations with mixed GPU fleets.

When the workload runs exclusively on one GPU vendor’s hardware — which is the case for most deep learning training (NVIDIA), most single-cloud deployments, and most embedded systems — the portability investment is waste. CUDA on NVIDIA, HIP on AMD, and oneAPI on Intel each provide deeper optimisation on their respective platforms than any cross-platform abstraction can match.

We have seen teams invest months in cross-platform portability for workloads that ended up running exclusively on NVIDIA hardware for the project’s entire lifetime. We have also seen teams hard-code CUDA-specific optimisations and later discover that a customer requirement or cloud migration demanded AMD or Intel support — at which point the algorithmic restructuring and kernel tuning decisions had to be revisited for a different architecture.

The portability decision should be made explicitly, based on the realistic hardware scope for the workload’s deployment lifetime — not on philosophical preference for open standards or vendor neutrality.

Without upfront hardware-scope analysis, teams risk either wasted portability investment or costly late-stage rewrites — a GPU Performance Audit quantifies both risks before the architecture is locked in.

Edge AI Applications: Deployment Tradeoffs for Autonomous Systems and Industrial Use Cases

Edge AI Applications: Deployment Tradeoffs for Autonomous Systems and Industrial Use Cases

7/05/2026

Edge AI applications in autonomous vehicles, industrial inspection, and smart cameras — deployment tradeoffs for model size, latency, and connectivity.

NVIDIA vs AMD GPU Performance: Why Software Stack Matters More Than Spec Sheets

NVIDIA vs AMD GPU Performance: Why Software Stack Matters More Than Spec Sheets

7/05/2026

NVIDIA's AI lead is primarily a software ecosystem advantage. Why hardware specs alone can't predict GPU performance when comparing NVIDIA and AMD.

Data Center GPU for AI Workloads: Own vs Rent, TCO, and NVLink Architecture

Data Center GPU for AI Workloads: Own vs Rent, TCO, and NVLink Architecture

7/05/2026

Data center GPUs vs cloud GPU rentals for AI workloads: TCO analysis, NVLink multi-GPU, and when owning hardware beats renting it.

How to Benchmark Your PC for AI: A Methodology That Goes Beyond Single Scores

How to Benchmark Your PC for AI: A Methodology That Goes Beyond Single Scores

7/05/2026

The three dimensions of meaningful AI benchmarking and why leaderboard numbers don't predict your performance. A practical AI benchmarking methodology.

CUDA vs OpenCL Performance Comparison: Portability, Optimization, and When to Choose Each

CUDA vs OpenCL Performance Comparison: Portability, Optimization, and When to Choose Each

7/05/2026

CUDA vs OpenCL: performance tradeoffs, portability constraints, and a practical decision framework for GPU compute API selection.

AI TOPS and GPU Utilization: When TOPS Is the Wrong Metric for Your Workload

AI TOPS and GPU Utilization: When TOPS Is the Wrong Metric for Your Workload

7/05/2026

TOPS and GPU utilization both mislead AI capacity planning. When to measure compute vs memory bandwidth vs throughput, and how to pick the right metric.

AI Benchmark Testing: What Makes a Benchmark Meaningful

AI Benchmark Testing: What Makes a Benchmark Meaningful

7/05/2026

A meaningful AI benchmark tests what your workload actually does. The gap between standardized tests and production performance, and how to close it.

AMD vs NVIDIA for AI Inference: When the Cost-Per-Inference Calculus Shifts

AMD vs NVIDIA for AI Inference: When the Cost-Per-Inference Calculus Shifts

6/05/2026

When AMD beats NVIDIA on inference cost-per-dollar and when NVIDIA's TensorRT advantage reverses the equation.

CUDA Kernel Explained: Thread Hierarchy, Execution, and When to Write Your Own

CUDA Kernel Explained: Thread Hierarchy, Execution, and When to Write Your Own

6/05/2026

What a CUDA kernel is, how threads and blocks map to GPU hardware, and when custom kernels beat library calls.

GPU Stress Testing for AI: What Sustained Load Reveals That Benchmarks Hide

GPU Stress Testing for AI: What Sustained Load Reveals That Benchmarks Hide

6/05/2026

GPUs scoring identically on short benchmarks can differ by 15-30% under sustained load. How stress testing exposes the limits that benchmarks miss.

CUDA GPU Architecture and Programming: What Makes a GPU CUDA-Capable

CUDA GPU Architecture and Programming: What Makes a GPU CUDA-Capable

6/05/2026

What makes a GPU CUDA-capable, how CUDA compute capability tiers work, and what the architecture enables for parallel compute workloads.

GPU Benchmark Software for AI: What Each Tool Measures and What It Misses

GPU Benchmark Software for AI: What Each Tool Measures and What It Misses

6/05/2026

Consumer benchmarks measure the wrong thing for AI. AI benchmarks test the wrong workloads. What each GPU benchmark tool measures and what to use instead.

How to Check TensorFlow GPU Detection and Diagnose Common Failures

6/05/2026

How to verify TensorFlow GPU detection with tf.config.list_physical_devices, diagnose CUDA version mismatches, driver issues, and common failure modes.

Benchmark Testing: What It Measures, What It Misses, and How to Do It Right for AI

6/05/2026

Benchmark scores and real AI performance differ by 20-50%. How to test in a way that predicts actual workload behaviour rather than lab conditions.

AMD vs Intel for AI: Why Spec-Sheet Comparisons Mislead and What to Measure Instead

6/05/2026

AMD vs Intel CPU performance for AI workloads varies by up to 3x depending on model architecture and software stack. No single 'better' answer exists.

AI Inference Infrastructure: Best Practices That Go Beyond Vendor Benchmark Claims

5/05/2026

Inference infrastructure decisions should be driven by measured performance under your actual workload — vendor benchmarks rarely match production conditions.

Tensor Parallelism vs Pipeline Parallelism: Choosing the Right Strategy for Your GPU Cluster

5/05/2026

Tensor parallelism splits operations across GPUs (low latency, high bandwidth need). Pipeline parallelism splits layers (tolerates lower bandwidth, adds bubble overhead).

Choosing Efficient AI Inference Infrastructure: What to Measure Beyond Raw GPU Speed

5/05/2026

Inference efficiency is performance-per-watt and cost-per-inference, not raw FLOPS. Batch size, precision, and memory bandwidth determine throughput.

CUDA Cores vs Tensor Cores: What Actually Determines AI Performance

5/05/2026

AI inference throughput depends primarily on tensor core utilisation, not CUDA core count. Tensor core generation determines supported precision formats.

CUDA Compute Capability Explained: What the Version Number Means for AI Workloads

5/05/2026

CUDA compute capability determines which tensor core operations and precision formats a GPU supports — not just whether CUDA runs.

How to Improve GPU Performance: A Profiling-First Approach to Compute Optimization

5/05/2026

Profiling must precede GPU optimisation. Memory bandwidth fixes typically deliver 2–5× more impact than compute-bound fixes for AI workloads.

BF16 vs FP16: When Dynamic Range Beats Precision and Vice Versa

5/05/2026

BF16 trades mantissa precision for dynamic range. The choice depends on whether your workload is gradient-dominated or activation-precision-dominated.

GPU Parallel Computing Explained: How Thousands of Cores Solve Problems Differently

5/05/2026

GPU parallelism exploits thousands of simple cores for data-parallel workloads. The execution model differs fundamentally from CPU thread-level parallelism.

AI TOPS Explained: Why This Popular Spec Tells You Almost Nothing About Real Performance

4/05/2026

TOPS measures theoretical throughput at one precision. It ignores memory bandwidth, software overhead, and workload fit — making it a poor performance predictor.

A100 GPU Rental Options: What Availability and Pricing Look Like in 2026

4/05/2026

A100 rental pricing varies 2–5× between providers depending on commitment length, region, and availability. Here is what the market looks like.

Agent Framework Selection for Edge-Constrained Inference Targets

2/05/2026

Selecting an agent framework for partial on-device inference: four axes that decide whether a desktop-class framework survives the edge-target boundary.

Distillation vs Quantisation for Multi-Platform Edge Inference: How to Choose

28/04/2026

Distillation and quantisation both shrink models for edge inference, but for three-or-more platforms only distillation keeps quality consistent.

GPU-Accelerating RF Signal Propagation Simulation: From Days to Hours

28/04/2026

Naive GPU porting of sequential RF simulation delivers modest gains. Algorithmic redesign to expose parallelism turns multi-day runtimes into hours.

Cloud GPU vs On-Premise AI Accelerators: A Total Cost Analysis

25/04/2026

Cloud GPU suits variable, short-term workloads. On-premise is cheaper for sustained utilisation above 60%. The break-even is calculable, not philosophical.

How to Optimise AI Inference Latency on GPU Infrastructure

24/04/2026

Inference latency optimisation targets model compilation, batching, and memory management — not hardware speed. TensorRT and quantisation are key levers.

Algorithmic Restructuring vs Kernel Tuning: Choosing the Higher-Leverage GPU Optimisation

23/04/2026

Kernel tuning improves constant factors. Algorithmic restructuring changes complexity class. Identify your bottleneck type before committing effort.

How to Profile GPU Kernels to Find the Real Bottleneck

22/04/2026

GPU profiling separates compute-bound from memory-bound kernels. Nsight Compute roofline analysis shows where a kernel sits and what would move it.

The Hidden Cost of GPU Underutilisation

21/04/2026

Most GPU workloads use 30–50% of available compute. Without profiling, the waste is invisible. Bandwidth, occupancy, and serialisation are the root causes.

CUDA vs OpenCL vs SYCL: Choosing a GPU Compute API

20/04/2026

CUDA delivers the deepest optimisation on NVIDIA hardware. OpenCL and SYCL offer portability. Choose based on lock-in tolerance and performance needs.

GPU Performance Per Dollar — Why Cost, Efficiency, and Value Are Not the Same Metric

17/04/2026

Performance per dollar. Tokens per watt. Cost per request. These sound like the same thing said differently, but they measure genuinely different dimensions of AI infrastructure economics. Conflating them leads to infrastructure decisions that optimize for the wrong objective.

Precision Is an Economic Lever in Inference Systems

17/04/2026

Precision isn't just a numerical setting — it's an economic one. Choosing FP8 over BF16, or INT8 over FP16, changes throughput, latency, memory footprint, and power draw simultaneously. For inference at scale, these changes compound into significant cost differences.

Precision Choices Are Constrained by Hardware Architecture

17/04/2026

You can't run FP8 inference on hardware that doesn't have FP8 tensor cores. Precision format decisions are conditional on the accelerator's architecture — its tensor core generation, native format support, and the efficiency penalties for unsupported formats.

Steady-State Performance, Cost, and Capacity Planning

17/04/2026

Capacity planning built on peak performance numbers over-provisions or under-delivers. Real infrastructure sizing requires steady-state throughput — the predictable, sustained output the system actually delivers over hours and days, not the number it hit in the first five minutes.

Why Benchmarks Mislead AI Hardware Procurement — and How to Use Them Correctly

16/04/2026

A benchmark result starts with full context — workload, software stack, measurement conditions. By the time it reaches a procurement deck, all that context is gone. The failure mode is not wrong benchmarks but context loss during propagation.

Building an Audit Trail: Benchmarks as Evidence for Governance and Risk

16/04/2026

High-value AI hardware decisions need traceable evidence, not slide-deck bullet points. When benchmarks are documented with methodology, assumptions, and limitations, they become auditable institutional evidence — defensible under scrutiny and revisitable when conditions change.

The Comparability Protocol: Why Benchmark Methodology Defines What You Can Compare

16/04/2026

Two benchmark scores can only be compared if they share a declared methodology — the same workload, precision, measurement protocol, and reporting conditions. Without that contract, the comparison is arithmetic on numbers of unknown provenance.

How to Choose AI Hardware and GPU for AI Workloads: A Decision Framework

16/04/2026

Hardware selection is a multivariate decision under uncertainty — not a score comparison. This framework walks through the steps: defining the decision, matching evaluation to deployment, measuring what predicts production, preserving tradeoffs, and building a repeatable process.

How Benchmarks Shape Organizations Before Anyone Reads the Score

16/04/2026

Before a benchmark score informs a purchase, it has already shaped what gets optimized, what gets reported, and what the organization considers important. Benchmarks function as decision infrastructure — and that influence deserves more scrutiny than the number itself.

Accuracy Loss from Lower Precision Is Task‑Dependent

16/04/2026

Reduced precision does not produce a uniform accuracy penalty. Sensitivity depends on the task, the metric, and the evaluation setup — and accuracy impact cannot be assumed without measurement.

Precision Is a Design Parameter, Not a Quality Compromise

16/04/2026

Numerical precision is an explicit design parameter in AI systems, not a moral downgrade in quality. This article reframes precision as a representation choice with intentional trade-offs, not a concession made reluctantly.

Mixed Precision Works by Exploiting Numerical Tolerance

16/04/2026

Not every multiplication deserves 32 bits. Mixed precision works because neural network computations have uneven numerical sensitivity — some operations tolerate aggressive precision reduction, others don't — and the performance gains come from telling them apart.

Throughput vs Latency: Choosing the Wrong Optimization Target

16/04/2026

Throughput and latency are different objectives that often compete for the same resources. This article explains the trade-off, why batch size reshapes behavior, and why percentiles matter more than averages in latency-sensitive systems.

Quantization Is Controlled Approximation, Not Model Damage

16/04/2026

When someone says 'quantize the model,' the instinct is to hear 'degrade the model.' That framing is wrong. Quantization is controlled numerical approximation — a deliberate engineering trade-off with bounded, measurable error characteristics — not an act of destruction.

Back See Blogs
arrow icon