Skip to content

Commit 906cf74

Browse files
committed
Improved stored
1 parent d47bb38 commit 906cf74

3 files changed

Lines changed: 27 additions & 16 deletions

File tree

python/benchmark/throughput_single.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,28 @@
66
import torch, piquant
77
torch.set_num_threads(mp.cpu_count())
88

9-
TOTAL_GIB = 64
9+
TOTAL_GIB = 32
1010
SRC_DTYPE = torch.bfloat16
11-
Q_DTYPE = torch.quint4x2
11+
Q_DTYPE = torch.quint4x2
1212
OUT_DTYPE = torch.bfloat16
1313

14-
SCALE, ZP = 1.0, 2
15-
16-
B_PER_ELEM = torch.tensor([], dtype=SRC_DTYPE).element_size() # 2 for bf16
14+
B_PER_ELEM = torch.tensor([], dtype=SRC_DTYPE).element_size()
1715
TOTAL_BYTES = TOTAL_GIB * (1 << 30)
18-
N_ELEMS = TOTAL_BYTES // B_PER_ELEM
16+
N_ELEMS = TOTAL_BYTES // B_PER_ELEM
17+
print(f'Numel = {N_ELEMS}')
1918

2019
with torch.inference_mode():
2120
x = torch.rand(N_ELEMS, dtype=SRC_DTYPE)
21+
SCALE, ZP = piquant.torch.compute_quant_params(x, dtype=Q_DTYPE)
2222

2323
t0 = time.perf_counter()
2424
with torch.inference_mode():
2525
q = piquant.torch.quantize(x, scale=SCALE, zero_point=int(ZP), dtype=Q_DTYPE)
2626
t1 = time.perf_counter()
27-
print(f"Quant time (bf16 -> uint4) for 100 GiB: {t1 - t0:.3f} s")
27+
print(f"Quant time (bf16 -> uint4) for {TOTAL_GIB} GiB: {t1 - t0:.3f} s")
2828

2929
t0 = time.perf_counter()
3030
with torch.inference_mode():
3131
y = piquant.torch.dequantize(q, scale=SCALE, zero_point=int(ZP), dtype=OUT_DTYPE)
3232
t1 = time.perf_counter()
33-
print(f"Dequant time (uint4 -> bf16) for 100 GiB source: {t1 - t0:.3f} s")
33+
print(f"Dequant time (uint4 -> bf16) for {TOTAL_GIB} GiB source: {t1 - t0:.3f} s")

python/quant_benchmark.png

78 KB
Loading

src/kernels/kernels_specialized.inl

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1189,14 +1189,25 @@ static auto PIQUANT_HOT dequant_uint4_to_bf16(
11891189
vf31 = _mm512_add_ps(vf31, _mm512_castsi512_ps(_mm512_slli_epi32(_mm512_cvtepu16_epi32(_mm256_loadu_si256(reinterpret_cast<const __m256i*>(o+i+112))), 16)));
11901190
#endif
11911191
}
1192-
_mm256_storeu_si256(reinterpret_cast<__m256i*>(o+i+0), cvt_ps_to_bf16(vf00));
1193-
_mm256_storeu_si256(reinterpret_cast<__m256i*>(o+i+16), cvt_ps_to_bf16(vf10));
1194-
_mm256_storeu_si256(reinterpret_cast<__m256i*>(o+i+32), cvt_ps_to_bf16(vf20));
1195-
_mm256_storeu_si256(reinterpret_cast<__m256i*>(o+i+48), cvt_ps_to_bf16(vf30));
1196-
_mm256_storeu_si256(reinterpret_cast<__m256i*>(o+i+64), cvt_ps_to_bf16(vf01));
1197-
_mm256_storeu_si256(reinterpret_cast<__m256i*>(o+i+80), cvt_ps_to_bf16(vf11));
1198-
_mm256_storeu_si256(reinterpret_cast<__m256i*>(o+i+96), cvt_ps_to_bf16(vf21));
1199-
_mm256_storeu_si256(reinterpret_cast<__m256i*>(o+i+112), cvt_ps_to_bf16(vf31));
1192+
#ifdef __AVX512BF16__
1193+
_mm256_storeu_si256(reinterpret_cast<__m256i*>(o+i+0), std::bit_cast<__m256i>(_mm512_cvtneps_pbh(vf00)));
1194+
_mm256_storeu_si256(reinterpret_cast<__m256i*>(o+i+16), std::bit_cast<__m256i>(_mm512_cvtneps_pbh(vf10)));
1195+
_mm256_storeu_si256(reinterpret_cast<__m256i*>(o+i+32), std::bit_cast<__m256i>(_mm512_cvtneps_pbh(vf20)));
1196+
_mm256_storeu_si256(reinterpret_cast<__m256i*>(o+i+48), std::bit_cast<__m256i>(_mm512_cvtneps_pbh(vf30)));
1197+
_mm256_storeu_si256(reinterpret_cast<__m256i*>(o+i+64), std::bit_cast<__m256i>(_mm512_cvtneps_pbh(vf01)));
1198+
_mm256_storeu_si256(reinterpret_cast<__m256i*>(o+i+80), std::bit_cast<__m256i>(_mm512_cvtneps_pbh(vf11)));
1199+
_mm256_storeu_si256(reinterpret_cast<__m256i*>(o+i+96), std::bit_cast<__m256i>(_mm512_cvtneps_pbh(vf21)));
1200+
_mm256_storeu_si256(reinterpret_cast<__m256i*>(o+i+112), std::bit_cast<__m256i>(_mm512_cvtneps_pbh(vf31)));
1201+
#else
1202+
_mm256_storeu_si256(reinterpret_cast<__m256i*>(o+i+0), cvt_ps_to_bf16(vf00));
1203+
_mm256_storeu_si256(reinterpret_cast<__m256i*>(o+i+16), cvt_ps_to_bf16(vf10));
1204+
_mm256_storeu_si256(reinterpret_cast<__m256i*>(o+i+32), cvt_ps_to_bf16(vf20));
1205+
_mm256_storeu_si256(reinterpret_cast<__m256i*>(o+i+48), cvt_ps_to_bf16(vf30));
1206+
_mm256_storeu_si256(reinterpret_cast<__m256i*>(o+i+64), cvt_ps_to_bf16(vf01));
1207+
_mm256_storeu_si256(reinterpret_cast<__m256i*>(o+i+80), cvt_ps_to_bf16(vf11));
1208+
_mm256_storeu_si256(reinterpret_cast<__m256i*>(o+i+96), cvt_ps_to_bf16(vf21));
1209+
_mm256_storeu_si256(reinterpret_cast<__m256i*>(o+i+112), cvt_ps_to_bf16(vf31));
1210+
#endif
12001211
}
12011212
#elif defined(__AVX2__)
12021213
#elif defined(__SSE4_2__)

0 commit comments

Comments
 (0)