Skip to content

Version 4.0.0 Release

Choose a tag to compare

@DavidMChan DavidMChan released this 22 Jul 15:56
· 3 commits to main since this release
a71dfd4

This is a major release that modernizes tsne-cuda for current datacenter GPUs, dramatically improves performance, and streamlines the build for packaging.

Modern GPU & CUDA support

  • Optimized architecture support for A100 (sm_80), H100/H200 (sm_90), and B200 (sm_100), plus GB202/RTX 50-series (sm_120), with an embedded PTX fallback for forward compatibility
  • Builds under CUDA 11.x, 12.x, and 13.x (the old code emitted removed architectures under CUDA 13)
  • Honors an externally supplied CMAKE_CUDA_ARCHITECTURES (e.g. via conda-forge CMAKE_ARGS)
  • Bumped to C++17, as required by modern FAISS

Performance (~6x faster on MNIST)

  • Full MNIST (60k points, 1000 iterations) drops from 53s to 8.4s on an A100-SXM4-80GB, with unchanged embedding quality, by eliminating redundant per-iteration host<->device synchronization
  • Skips the per-iteration gradient-norm reduction when it is not used (the default), clears buffers with cudaMemsetAsync, and builds the KNN index on a single GPU instead of sharding across all visible GPUs
  • New TSNE_SYNC_KERNELS=1 environment variable (or -DTSNE_FORCE_SYNC) restores synchronous mode for debugging and accurate per-phase timing
  • Kernel launch parameters are now tunable per-architecture (see cmake/benchmarks/tune_kernels.py)

Streamlined build (breaking changes)

  • Removed the vestigial gflags, gtest, and CPU BLAS/LAPACK dependencies
  • Removed the standalone C++ CLI (and its cxxopts submodule) and the ZMQ interactive-visualization path -- the Python module is the supported entry point
  • Together these substantially simplify packaging (see the conda-forge feedstock)

Note: This is a breaking release (major version bump) because the C++ CLI and the ZMQ interactive-visualization feature have been removed. The Python API is unchanged.


Prebuilt wheels

Wheels are attached below, one per CUDA runtime. They are py3-none-any — a single wheel works on any Python 3.x (the library is loaded via ctypes, so it has no Python-ABI dependency). Install the one matching your CUDA toolkit; you also need a GPU build of FAISS available at runtime (e.g. conda install -c conda-forge libfaiss).

wheel CUDA GPUs
tsnecuda-4.0.0+cu118 11.8 A100, H100/H200
tsnecuda-4.0.0+cu124 12.4 A100, H100/H200
tsnecuda-4.0.0+cu126 12.6 A100, H100/H200
tsnecuda-4.0.0+cu129 12.9 A100, H100/H200, B200
tsnecuda-4.0.0+cu130 13.0 A100, H100/H200, B200
pip install https://github.com/CannyLab/tsne-cuda/releases/download/4.0.0/tsnecuda-4.0.0+cu129-py3-none-any.whl

Each wheel was validated by running MNIST (60k points, 1000 iterations) end-to-end on an A100 (~6–8 s, kNN digit-label accuracy ≈ 0.955). The CUDA 13 wheel additionally required a small Thrust/cuFFT compatibility fix (#142) that is not in the tagged 4.0.0 source.