The obstacle, stated precisely
Fusing an elementwise chain is easy: each output element depends on one input element, so a kernel can process any block independently.
Softmax is not elementwise. For a row of scores, each output is the exponential of that score divided by the sum of exponentials across the entire row. Every output depends on every input in its row.
That is what blocks naive tiling. Load a block of keys, compute the scores for that block, and you cannot normalise them, because the denominator involves keys you have not looked at yet. The obvious conclusion is that you must compute all the scores first, which means materialising the matrix, which is exactly what you were trying to avoid.
There is a second problem underneath. Softmax is implemented by subtracting the row maximum before exponentiating, because raw scores can be large and the exponential overflows in 16-bit at surprisingly modest values. The maximum is also a property of the whole row.
So tiling requires computing both a sum and a maximum over data that has not arrived. That looks impossible, and it is not.

