A new fused softmax kernel function
# What does this PR do ?
Implemented the fused softmax GPU kernel that can be a drop-in replacement of the `apex`'s FusedScaleMaskSoftmax`. It addresses the following issues:
1. Removed the sequence length limitation. It works with tensor of any length.
2. Fix the `grad_input` modification issue https://github.com/NVIDIA/apex/issues/1430
3. Fix the problem when all keys are masked https://github.com/NVIDIA/apex/issues/1390

It uses the torch.cppextension to build the kernel dynamically like MegatronLM repo does. The kernels will be saved in the `/tmp` directory so it can be used in slurm with enroot clusters too.
It includes a unit test to cover a few cases.
The performance is comparable to the apex one. Here is a training step time graph when it is tested with training a RETRO model.
![image](https://user-images.githubusercontent.com/43824965/180662857-712f48e4-dc9b-40f7-aad5-13e82004a30b.png)
The blue curve is pytorch softmax. The bottom red curve is apex fused kernel and the middle red curve the fused kernel in this PR.


