Is pooling vram with Nvidia NV-Link actually possible?
TLDR: it is possible; Blender team should know better, as well as tech people at Nvidia.
The ability to pool memory depends on the implementation of the software using it for Geforce cards, and I understood that it can be automatic (I understand managed by the driver) with profesionnal display cards ie., Quadro (generations before Ampere), and later RTX A6000. For the non display professional/enterprise cards (A100, in DGX Station A100, DGX A100), it happens with a multiway nvlink.
Cards however must be of the same generation, The NVlink is updated from generation to generation and is not backward/forward compatible.
Test with Turing generation Geforce
Memory pooling works with Turing generation Geforce cards (2080, 2080Ti, Titan RTX), in GNU/Linux and Windows 10.
reference: https://www.pugetsystems.com/labs/articles/NVLink-on-NVIDIA-GeForce-RTX-2080-2080-Ti-in-Windows-10-1253/
Comments on cuda 11.2 and pooled memory: Stream-ordered memory allocator
One of the highlights of CUDA 11.2 is the new stream-ordered CUDA memory allocator. This feature enables applications to order memory allocation and deallocation with other work launched into a CUDA stream such as kernel launches and asynchronous copies. This improves application performance by taking advantage of stream-ordering semantics to reuse memory allocations, using and managing memory pools to avoid expensive calls into the OS. The new asynchronous memory allocation and free API actions allow you to manage memory use as part of your application’s CUDA workflow. For many applications, this reduces the need for custom memory management abstractions, and makes it easier to create high-performance custom memory management for applications that need it. Moreover, this feature makes it easier to share memory pools across entities within an application.
cudaMallocAsync(&amp;ptr, size, stream); // Allocates physical memory
kernel&lt;&lt;&lt;...,stream&gt;&gt;&gt;(ptr);
cudaFreeAsync(ptr, stream);          // releases memory back into a pool
cudaMallocAsync(&amp;ptr, size, stream); // Reuses previously freed pointer
kernel&lt;&lt;&lt;...,stream&gt;&gt;&gt;(ptr);
cudaFreeAsync(ptr, stream);          // releases memory back into a pool
....                                 // Executes other work in the stream

As shown in this example, CUDA 11.2 introduces new stream-ordered versions of cudaMalloc and cudaFree—called cudaMallocAsync and cudaFreeAsync—which take a stream as an additional argument. The first call to cudaMallocAsync in the example allocates memory from the OS, but the subsequent call to cudaFreeAsync does not free it back to the OS. Instead, the memory is stored in a pool maintained by the CUDA driver, which allows the second call to cudaMallocAsync to reuse the memory previously freed, if it is of sufficient size.
reference: https://developer.nvidia.com/blog/enhancing-memory-allocation-with-new-cuda-11-2-features/