Make `Scope` and `Semantics` normal arguments rather than const generics
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Rust
- Estrellas
- 3.4k
- Forks
- 126
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Descripción
The usage of atomics is quite awkward:
let position_in_bucket = unsafe {
atomic_i_add::<_, { Scope::QueueFamily as u32 }, { Semantics::NONE.bits() }>(
bucket_count,
1,
)
};
Not only one needs to know what each u32 is, it is not even consistent with the need to cast in one case and calling .bits() in another.
Similarly, barriers are awkward too:
control_barrier::<
{ Scope::Workgroup as u32 },
{ Scope::Workgroup as u32 },
{ Semantics::NONE.bits() },
>();
It is even worse when memory semantics is involved (though many of such cases have helper methods):
control_barrier::<
{ Scope::Workgroup as u32 },
{ Scope::Workgroup as u32 },
{
Semantics::WORKGROUP_MEMORY.bits() | Semantics::ACQUIRE_RELEASE.bits()
},
>();
Subjectively, three u32s that need to be composed in a very particular way are quite ugly.
Consider changing API to use normal types for these arguments, so we can all enjoy autocomplete in IDE, better formatting and implement ability to combine semantics variants, like this:
let position_in_bucket = unsafe {
atomic_i_add(
bucket_count,
1,
Scope::QueueFamily,
Semantics::None,
)
};
control_barrier(
Scope::Workgroup,
Scope::Workgroup,
Semantics::WorkgroupMemory | Semantics::AcquireRelease,
);
The result of Semantics::WorkgroupMemory | Semantics::AcquireRelease can be Semantics::Combined(u32) for example, with Debug implementation overridden to render human-readable set of enabled flags.
Alternatively, a builder pattern could be used for Semantics with const fn to have guarantees of sane composition in case some invariants fundamentally do not make sense.
At some point non-integer const generics will become available, but even then I see no benefit from const generics for this particular use case.
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Empieza localizando las API atomic_i_add y control_barrier y los usos mostrados en el issue. Compara las alternativas de argumentos normales y de builder, incluido cómo se componen los valores Scope y Semantics. El objetivo se considera cumplido cuando estas API ya no requieren los tres argumentos genéricos const u32 y las llamadas mostradas siguen pudiéndose usar con combinaciones legibles de Semantics.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- rust
- Área
- backend-api-design
- Tipo de issue
- Nueva funcionalidad
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Estado de actividad
- Tranquilo
- Claridad
- Bastante claro
- Aptitud para principiantes
- 42/100