deepseek-ai / deepseek-ai/FlashMLA

[Portability][MSVC] Replace compound-literal-style dependent-type initialization in dense MLA decode

Open Beginner friendly
#218 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
C++
Stars
12.9k
Forks
1.2k
Avg merge
4h 20m
Merged PRs (30d)
2

Description

### Background

I encountered this issue while building the vllm-project/FlashMLA fork through SystemPanic/vllm-windows for a deployment serving DeepSeek-V4-Flash-0731 on 4 x H200 NVL GPUs.

### Problem

`csrc/sm90/decode/dense/splitkv_mla.cuh` contains 16 dependent-type initializations using the following form:

(typename T::X){}

Examples include:

TiledMMA tiled_mma_sQ =
(typename T::TiledMMA_QK_sQ){};

Tensor sV = make_tensor(
sK.data(),
(typename T::SmemLayoutV){}
);

Tensor sQ = make_tensor(
make_smem_ptr(plan.smem_sQ.data()),
(typename T::SmemLayoutQ){}
);

This parenthesized type followed by a braced initializer is compound-literal-style syntax accepted as an extension by GNU-compatible toolchains. It is not portable to the NVCC and MSVC build used for my Windows deployment.

I understand that native Windows may not be part of the supported FlashMLA build matrix. However, the equivalent standard C++ form works across toolchains and does not change the existing Linux behavior.

### Tested fix

The working downstream build removes the parentheses around the dependent type:

- TiledMMA tiled_mma_sQ =
- (typename T::TiledMMA_QK_sQ){};
+ TiledMMA tiled_mma_sQ =
+ typename T::TiledMMA_QK_sQ{};

- Tensor sV = make_tensor(
- sK.data(),
- (typename T::SmemLayoutV){}
- );
+ Tensor sV = make_tensor(
+ sK.data(),
+ typename T::SmemLayoutV{}
+ );

- Tensor sQ = make_tensor(
- make_smem_ptr(plan.smem_sQ.data()),
- (typename T::SmemLayoutQ){}
- );
+ Tensor sQ = make_tensor(
+ make_smem_ptr(plan.smem_sQ.data()),
+ typename T::SmemLayoutQ{}
+ );

The same mechanical conversion was applied to all 16 affected brace-initialization sites.

This allowed the dense MLA source to build successfully with NVCC and MSVC.

### Semantics

Both forms value-initialize a temporary of the same dependent member type.

The affected expressions use empty initializers, and the tested change does not alter:

- initializer arguments;
- narrowing behavior;
- object lifetime;
- overload resolution;
- the resulting type;
- expected Linux code generation.

The replacement form:

typename T::X{}

is standard C++ and does not require an MSVC-specific conditional.

### Environment

- Windows Server 2022
- Visual Studio Build Tools with MSVC
- CUDA/NVCC 13.2
- Python 3.12
- PyTorch 2.11.0+cu130
- SystemPanic/vllm-windows 0.25-based deployment
- DeepSeek-V4-Flash-0731
- 4 x H200 NVL GPUs, SM90a

### Suggested resolution

Convert the 16 compound-literal-style brace-initialization expressions:

(typename T::X){}

to the standard C++ form:

typename T::X{}

Other occurrences such as C-style casts and `sizeof(typename T::...)` are separate, valid constructs and should remain unchanged.

Contributor guide

No contributing guide indexed for this repository

Research direction

Open csrc/sm90/decode/dense/splitkv_mla.cuh and locate the 16 dependent-type initializations using the parenthesized form. Apply the standard form consistently, leave casts and sizeof expressions unchanged, and verify that the dense MLA source builds with NVCC and MSVC as described.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp
Domain
compilers
Issue type
Bug
Difficulty
2/5
Estimated time
1-3 hours
Activity status
Active
Clarity
Clearly specified
Newbie friendliness
88/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.