@@ -112,6 +112,9 @@ typedef sycl::half2 ggml_half2;
112112#define QI_NVFP4 (QK_NVFP4 / (4 * QR_NVFP4 ))
113113#define QR_NVFP4 2
114114
115+ #define QI_ROCMFP4 (QK_ROCMFP4 / (4 * QR_ROCMFP4 ))
116+ #define QR_ROCMFP4 2
117+
115118#define QI5_0 (QK5_0 / (4 * QR5_0 ))
116119#define QR5_0 2
117120
@@ -226,6 +229,23 @@ typedef struct {
226229} block_nvfp4;
227230static_assert (sizeof (block_nvfp4) == sizeof (uint8_t )*(QK_NVFP4 /QK_NVFP4_SUB ) + QK_NVFP4 /2 , " wrong nvfp4 block size/padding" );
228231
232+ #define QK_ROCMFP4 32
233+ // AMD-tuned compact layout: 16 bytes of packed E2M1-derived 4-bit codes, then
234+ // one unsigned E4M3 scale byte per 16-weight half block.
235+ typedef struct {
236+ uint8_t qs[QK_ROCMFP4 /2 ];
237+ uint8_t e[2 ];
238+ } block_rocmfp4;
239+ static_assert (sizeof (block_rocmfp4) == QK_ROCMFP4 /2 + 2 *sizeof (uint8_t ), " wrong rocmfp4 block size/padding" );
240+
241+ // Speed-focused layout: same 32 packed ROCmFP4 nibbles, but one UE4M3 scale
242+ // for the whole block.
243+ typedef struct {
244+ uint8_t qs[QK_ROCMFP4 /2 ];
245+ uint8_t e;
246+ } block_rocmfp4_fast;
247+ static_assert (sizeof (block_rocmfp4_fast) == QK_ROCMFP4 /2 + sizeof (uint8_t ), " wrong rocmfp4 fast block size/padding" );
248+
229249#define QK5_0 32
230250typedef struct {
231251 ggml_half d; // delta
@@ -1136,6 +1156,47 @@ GGML_TABLE_BEGIN(int8_t, kvalues_rocmfp4, 16)
11361156 0 , 1 , 2 , 3 , 4 , 6 , 8 , 10 , 0 , -1 , -2 , -3 , -4 , -6 , -8 , -10 ,
11371157GGML_TABLE_END ()
11381158
1159+ // ROCmFP4 UE4M3 "half-scale" values for the finite scale bytes 0x00..0x7e (127
1160+ // entries): the subnormal run (byte>>3 == 0, value M*2^-10) followed by 15
1161+ // normal exponent groups (value (8+M)*2^(e-10), e=1..15). This is the single
1162+ // source of truth shared by both materializations of the table: the CPU
1163+ // quantizer scale-search table (ggml-quants.c) and the opt-in GPU
1164+ // constant-memory LUT (ggml-cuda/common.cuh). Each backend stamps its own
1165+ // storage-qualified array from this list so the two can never drift.
1166+ #define GGML_ROCMFP4_SCALE_UE4M3_HALF_LIST \
1167+ (0 ) * 0x1p-10f , (1 ) * 0x1p-10f , (2 ) * 0x1p-10f , (3 ) * 0x1p-10f , \
1168+ (4 ) * 0x1p-10f , (5 ) * 0x1p-10f , (6 ) * 0x1p-10f , (7 ) * 0x1p-10f , \
1169+ (8 + 0 ) * 0x1p-10f , (8 + 1 ) * 0x1p-10f , (8 + 2 ) * 0x1p-10f , (8 + 3 ) * 0x1p-10f , \
1170+ (8 + 4 ) * 0x1p-10f , (8 + 5 ) * 0x1p-10f , (8 + 6 ) * 0x1p-10f , (8 + 7 ) * 0x1p-10f , \
1171+ (8 + 0 ) * 0x1p-9f , (8 + 1 ) * 0x1p-9f , (8 + 2 ) * 0x1p-9f , (8 + 3 ) * 0x1p-9f , \
1172+ (8 + 4 ) * 0x1p-9f , (8 + 5 ) * 0x1p-9f , (8 + 6 ) * 0x1p-9f , (8 + 7 ) * 0x1p-9f , \
1173+ (8 + 0 ) * 0x1p-8f , (8 + 1 ) * 0x1p-8f , (8 + 2 ) * 0x1p-8f , (8 + 3 ) * 0x1p-8f , \
1174+ (8 + 4 ) * 0x1p-8f , (8 + 5 ) * 0x1p-8f , (8 + 6 ) * 0x1p-8f , (8 + 7 ) * 0x1p-8f , \
1175+ (8 + 0 ) * 0x1p-7f , (8 + 1 ) * 0x1p-7f , (8 + 2 ) * 0x1p-7f , (8 + 3 ) * 0x1p-7f , \
1176+ (8 + 4 ) * 0x1p-7f , (8 + 5 ) * 0x1p-7f , (8 + 6 ) * 0x1p-7f , (8 + 7 ) * 0x1p-7f , \
1177+ (8 + 0 ) * 0x1p-6f , (8 + 1 ) * 0x1p-6f , (8 + 2 ) * 0x1p-6f , (8 + 3 ) * 0x1p-6f , \
1178+ (8 + 4 ) * 0x1p-6f , (8 + 5 ) * 0x1p-6f , (8 + 6 ) * 0x1p-6f , (8 + 7 ) * 0x1p-6f , \
1179+ (8 + 0 ) * 0x1p-5f , (8 + 1 ) * 0x1p-5f , (8 + 2 ) * 0x1p-5f , (8 + 3 ) * 0x1p-5f , \
1180+ (8 + 4 ) * 0x1p-5f , (8 + 5 ) * 0x1p-5f , (8 + 6 ) * 0x1p-5f , (8 + 7 ) * 0x1p-5f , \
1181+ (8 + 0 ) * 0x1p-4f , (8 + 1 ) * 0x1p-4f , (8 + 2 ) * 0x1p-4f , (8 + 3 ) * 0x1p-4f , \
1182+ (8 + 4 ) * 0x1p-4f , (8 + 5 ) * 0x1p-4f , (8 + 6 ) * 0x1p-4f , (8 + 7 ) * 0x1p-4f , \
1183+ (8 + 0 ) * 0x1p-3f , (8 + 1 ) * 0x1p-3f , (8 + 2 ) * 0x1p-3f , (8 + 3 ) * 0x1p-3f , \
1184+ (8 + 4 ) * 0x1p-3f , (8 + 5 ) * 0x1p-3f , (8 + 6 ) * 0x1p-3f , (8 + 7 ) * 0x1p-3f , \
1185+ (8 + 0 ) * 0x1p-2f , (8 + 1 ) * 0x1p-2f , (8 + 2 ) * 0x1p-2f , (8 + 3 ) * 0x1p-2f , \
1186+ (8 + 4 ) * 0x1p-2f , (8 + 5 ) * 0x1p-2f , (8 + 6 ) * 0x1p-2f , (8 + 7 ) * 0x1p-2f , \
1187+ (8 + 0 ) * 0x1p-1f , (8 + 1 ) * 0x1p-1f , (8 + 2 ) * 0x1p-1f , (8 + 3 ) * 0x1p-1f , \
1188+ (8 + 4 ) * 0x1p-1f , (8 + 5 ) * 0x1p-1f , (8 + 6 ) * 0x1p-1f , (8 + 7 ) * 0x1p-1f , \
1189+ (8 + 0 ) * 0x1p+0f , (8 + 1 ) * 0x1p+0f , (8 + 2 ) * 0x1p+0f , (8 + 3 ) * 0x1p+0f , \
1190+ (8 + 4 ) * 0x1p+0f , (8 + 5 ) * 0x1p+0f , (8 + 6 ) * 0x1p+0f , (8 + 7 ) * 0x1p+0f , \
1191+ (8 + 0 ) * 0x1p+1f , (8 + 1 ) * 0x1p+1f , (8 + 2 ) * 0x1p+1f , (8 + 3 ) * 0x1p+1f , \
1192+ (8 + 4 ) * 0x1p+1f , (8 + 5 ) * 0x1p+1f , (8 + 6 ) * 0x1p+1f , (8 + 7 ) * 0x1p+1f , \
1193+ (8 + 0 ) * 0x1p+2f , (8 + 1 ) * 0x1p+2f , (8 + 2 ) * 0x1p+2f , (8 + 3 ) * 0x1p+2f , \
1194+ (8 + 4 ) * 0x1p+2f , (8 + 5 ) * 0x1p+2f , (8 + 6 ) * 0x1p+2f , (8 + 7 ) * 0x1p+2f , \
1195+ (8 + 0 ) * 0x1p+3f , (8 + 1 ) * 0x1p+3f , (8 + 2 ) * 0x1p+3f , (8 + 3 ) * 0x1p+3f , \
1196+ (8 + 4 ) * 0x1p+3f , (8 + 5 ) * 0x1p+3f , (8 + 6 ) * 0x1p+3f , (8 + 7 ) * 0x1p+3f , \
1197+ (8 + 0 ) * 0x1p+4f , (8 + 1 ) * 0x1p+4f , (8 + 2 ) * 0x1p+4f , (8 + 3 ) * 0x1p+4f , \
1198+ (8 + 4 ) * 0x1p+4f , (8 + 5 ) * 0x1p+4f , (8 + 6 ) * 0x1p+4f
1199+
11391200#define NGRID_IQ1S 2048
11401201#define IQ1S_DELTA 0 .125f
11411202#define IQ1M_DELTA 0 .125f
0 commit comments