- 指定初始化器(designated initializer) 是 C 语言和 C++ 中的一种特性,允许在初始化结构体或数组时显式指定某个成员或元素的名称和初始值,而不是按顺序提供所有值。
1. 初始化结构体:
- 可以使用指定初始化器来初始化结构体的特定成员,而不必按顺序传递所有字段的值。
struct Point {
int x;
int y;
};
struct Point p1 = { .x = 1, .y = 2 }; // .{成员名} = 值 指定初始化器
在这段代码中,GGML_TYPE_F32
并不是一个变量,而是一个 枚举值 或 常量,通常是一个用来表示数据类型的标识符。
2. 初始化数组:
int arr[5] = { [0] = 10, [3] = 20 }; // 指定初始化器
- 数组
arr
的第 0 个元素被初始化为 10,第 3 个元素被初始化为 20,其余元素将被默认初始化为 0。
3. 结构体数组初始化:
struct Point points[3] = {
[0] = { .x = 1, .y = 2 },
[1] = { .x = 3, .y = 4 },
[2] = { .x = 5, .y = 6 }
};
- 实际示例:
static const struct ggml_type_traits_cpu type_traits_cpu[GGML_TYPE_COUNT] = {
[GGML_TYPE_F32] = {
.vec_dot = (ggml_vec_dot_t) ggml_vec_dot_f32,
.vec_dot_type = GGML_TYPE_F32,
.nrows = 1,
},
[GGML_TYPE_F16] = {
.from_float = (ggml_from_float_t) ggml_fp32_to_fp16_row,
.vec_dot = (ggml_vec_dot_t) ggml_vec_dot_f16,
.vec_dot_type = GGML_TYPE_F16,
.nrows = 1,
},
// 其他类型...
};
-
GGML_TYPE_COUNT为确定值。
-
以上代码中
GGML_TYPE_F32
是常量:// https://github1s.com/ggerganov/ggml/blob/master/include/ggml.h#L354-L396 NOTE: always add types at the end of the enum to keep backward compatibility enum ggml_type { GGML_TYPE_F32 = 0, GGML_TYPE_F16 = 1, GGML_TYPE_Q4_0 = 2, GGML_TYPE_Q4_1 = 3, // GGML_TYPE_Q4_2 = 4, support has been removed // GGML_TYPE_Q4_3 = 5, support has been removed GGML_TYPE_Q5_0 = 6, GGML_TYPE_Q5_1 = 7, GGML_TYPE_Q8_0 = 8, GGML_TYPE_Q8_1 = 9, GGML_TYPE_Q2_K = 10, GGML_TYPE_Q3_K = 11, GGML_TYPE_Q4_K = 12, GGML_TYPE_Q5_K = 13, GGML_TYPE_Q6_K = 14, GGML_TYPE_Q8_K = 15, GGML_TYPE_IQ2_XXS = 16, GGML_TYPE_IQ2_XS = 17, GGML_TYPE_IQ3_XXS = 18, GGML_TYPE_IQ1_S = 19, GGML_TYPE_IQ4_NL = 20, GGML_TYPE_IQ3_S = 21, GGML_TYPE_IQ2_S = 22, GGML_TYPE_IQ4_XS = 23, GGML_TYPE_I8 = 24, GGML_TYPE_I16 = 25, GGML_TYPE_I32 = 26, GGML_TYPE_I64 = 27, GGML_TYPE_F64 = 28, GGML_TYPE_IQ1_M = 29, GGML_TYPE_BF16 = 30, GGML_TYPE_Q4_0_4_4 = 31, GGML_TYPE_Q4_0_4_8 = 32, GGML_TYPE_Q4_0_8_8 = 33, GGML_TYPE_TQ1_0 = 34, GGML_TYPE_TQ2_0 = 35, GGML_TYPE_IQ4_NL_4_4 = 36, // GGML_TYPE_IQ4_NL_4_8 = 37, // GGML_TYPE_IQ4_NL_8_8 = 38, GGML_TYPE_COUNT, };