Enjoying this issue?
Get tomorrow's AI & engineering digest in your inbox — hand-picked, summarized, and always spam-free.
TLDR
Switching matrix operations from Nvidia GPUs to Huawei's Ascend requires far more than a chip swap — the data layout, memory hierarchy, and supporting software are fundamentally different. DeepSeek's Deep Gem Ascend library supplies implementations for specific operations like matrix multiplication and attention scores, but it only covers part of the CUDA ecosystem, and masked grouped matrix multiplication interfaces are explicitly unimplemented. The real barrier is the accumulated software around CUDA — compilers, profilers, debugging tools — that has no direct equivalent on Ascend, meaning a full application migration still requires substantial engineering.
Key points
DeepSeek's Deep Gem Ascend library provides CUDA-like kernel implementations for Huawei Ascend chips.
The library explicitly marks masked grouped matrix multiplication interfaces as unimplemented.
The memory hierarchy on Ascend requires different data layouts and movement compared to Nvidia GPUs.
DeepSeek reports performance results approaching hardware ceiling on Ascend 950DT, but these are not independently verified.
Tools mentioned
Techniques
- matrix multiplication
- memory hierarchy
- fractal layout
- operand reuse
- pipelining
- scale factor packing
Stop scrolling. Start reading smarter.
Receive the day's most important AI & engineering updates in one concise email. No spam.
Transcript (captions)
Move this matrix multiplication from an Nvidia GPU to Huawei's Ascend. Buying the chip doesn't supply the software that arranges these numbers and gets them into the calculation. If both chips
can multiply these numbers, why is switching difficult? Because the data needs a different arrangement and a different route into working storage. Deepseek's Deep Gem Ascend release
announced September 30th, 2026 supplies that machinery for supported operations with familiar entry points. Some operations are still missing. What changes underneath the same function
call? Watch these blue and orange tiles move from the storage shelf into smaller work trays. A blue row meets an orange column. Multiply the matching entries, then add those products. You've got one
position in the output. Repeat across the grids to build the result. Our illustration keeps that mathematical request visible while the machinery around it changes. Zoom out and you can
see the implementation moving whole tiles of those matrices through storage before calculating. We've got two jobs to follow. Doing the arithmetic and getting the right chunks into position
so the arithmetic can happen. Picture a large storage shelf with smaller work trays near the calculator. Huawei's documentation describes a trade-off between capacity and access efficiency.
You can hold more out on the shelf, but where you put the data matters when computation needs it. We call the specialized code handling this operation a kernel. This ascend kernel moves
matrix tiles from global memory into L1 then into L0 for matrix multiply ad. Those are the storage names behind our shelf and trays. Along the way, the tiles change arrangement, too. When
loading them into L1, the code uses what it calls a fractal layout. Leave the indexing details aside for now. Preparing these numbers includes choosing where each one sits. The
arithmetic hasn't changed. The seating plan has. Moving an operation between chips takes real engineering even when its purpose looks identical from the application. You're asking for the same
result, but the implementation has to organize the work for this chip. Low precision operations also use scale factors, values that set the numerical scale of the stored numbers. Picture
them as tags attached to the tiles. Ascend expects those tags in a particular packed format and layout. So moving the operation means preparing that supporting data too. Here, the
conversion helper packs pairs of scale factor values into 16bit integer containers arranged in what the code calls MN major layout. Beside an entire chip switch that sounds tiny, a
compatible implementation still has to get it right. Already got a tensor in the right format. The helper can reuse it, otherwise it launches a conversion. Even this preparation step needs a
decision. Can the calculation use the supporting data as it stands, or does it need rearranging first? Back at the matrix trays, watch the blue tile stay put while a new orange tile arrives.
With operand reuse, an input can remain available for another piece of work. You don't have to fetch it again for that next calculation. Keeping that input nearby reduces repeated transfers. We
can't turn that observation into a speedup number, but we can see the work it avoids. Why move the same input again when the next calculation can use the copy that's already there? Now add a
second tray. While one set of tiles feeds the calculation, another stage can prepare incoming data. Using staged buffers and coordinating requests in flight lets these activities overlap.
Our workbench is starting to behave like a production line. Careful with that overlap, though. A calculation can't use data that hasn't arrived. Parallel stages need synchronization when one
depends on another's data. Picture a ready signal on each tray. Work can overlap, but the next stage still needs its inputs. Together those storage levels form a memory hierarchy.
Overlapping the stages is called pipelining. You've already watched both at work. Tiles move between storage levels and incoming data gets prepared while another set is involved in
calculation. Seen this way. Deepseek's contribution is easier to pin down. Its original deep gem is a CUDA kernel library. For ascend, it supplies implementations that handle the layouts
and data movement we followed. A relatively familiar interface has substantial engineering underneath it. For matrix multiplication, the library supports several number formats. BF16
uses 16 bits, FP8 uses 8 and FP4 uses four. Beyond that, MQA logits handles attention scores in multi-query attention and megae serves mixture of experts models. Supporting these
specific operations doesn't establish that a whole application has moved. Coverage has a specific gap too. Although the Redmi claims full API compatibility, the implementation
explicitly marks masked grouped matrix multiplication interfaces as unimplemented. Familiar entry points help, but you still need to check which operations your application actually
calls before planning a move. Check the target environment as well. According to the repository development and validation use the Ascend 950 series, you'll need CAN 9.20 and torch npu.
Those requirements come before any performance discussion. A familiar function name is doing a lot of public relations here. Calling code gets a recognizable doorway which helps. Walk
through it though and data preparations, supported operations and required software still determine whether your application can use what's behind it. Beyond that doorway, CUDA covers
compilers, runtime and driver interfaces, mathematical libraries, debugging tools, and profilers. Our matrix kernel occupies one part of that platform. Replacing it still leaves the
surrounding software to account for when you move an application. Hay's CAN provides Ascend's broader platform including compiler support, runtime interfaces, operator and communication
libraries and analysis tools. So CAN is the more useful comparison with CUDA. Deep Gem Ascend sits inside that wider environment supplying particular operations an application can use. As a
developer, you need more than one successful calculation. You've got to build the application, use its supporting libraries, inspect problems, and work out where execution time goes.
Compilers, debugging tools, and profilers help you do those jobs around the kernel. Years of engineering have also built up around CUDA. NVIDIA's historical ecosystem account describes
application ports, partner libraries, language integrations, and deployment tools. Alongside that history, its current documentation shows how much software developers have available
around the calculations themselves. Changing kernels may be only part of the move. A team may also need to replace integrations and learn different tools. CUDA's accumulated software helps
explain why switching can take work, but these sources don't tell us how much work any particular team would face. A reusable library can take on some of that work. If it covers an operation
your application needs, you may be able to use its implementation instead of writing the machinery for this chip yourself. Multiple applications can draw on the same engineering. to reuse it.
Your required operations need coverage. Your data needs to fit the interface and your environment needs the required software. Meeting those conditions could reduce migration work. How much time a
team would save isn't established by this release. On performance, Deepseek reports selected dense matrix multiplication results approaching its stated hardware ceiling. Measurements
use ascend 950DT, CAN 9.20, and cold L2 profiling. Keep the attribution attached. These are deepseeks figures, not independently reproduced measurements. Read those results at the
scale they measure, selected kernels under stated conditions. They don't establish a matched win against an Nvidia system or the throughput of a whole model. Each comparison would need
measurements that cover the software involved. To judge your application, measure its actual workload with the surrounding software included. For a developer considering ascend, I'd start
by mapping the operations the application needs. match them against the library's coverage, including the explicitly unimplemented interfaces. Then check the expected layouts and
software requirements before planning how to move the rest. Next comes measuring the workload you actually care about. A benchmark table can't attend your integration meeting for you. You
need to know how this implementation behaves inside your application with its required operations and surrounding software under conditions that make the comparison meaningful across
applications. Reusable engineering is the promising part. Layout conversion, operand reuse, and coordinated loading don't have to become separate projects every time. A maintained implementation
can handle that machinery for applications whose operations it covers, giving developers work they can build on. Broader adoption still needs coverage, dependable tooling, and
measured application performance. Deep Gem Ascend contributes to that effort, but its implementation and documented validation concern Huawei Ascend specifically. This release doesn't
establish a universal software layer for other chip vendors. Return to our original switch. Beneath a familiar call, the implementation repack supporting data, moves tiles through
different storage levels, reuses inputs, and synchronizes stages. Asking for the same mathematical result doesn't tell a different chip how to organize all that work. My verdict for developers
evaluating Huawei Ascend, Deep Gem Ascend is worth evaluating for the operations it supports. Judge it inside your application where reusable machinery could take some migration work
off your plate. Which parts of your workload would still need their own implementation?