Vectors

Zig proporciona tipos de vectores para SIMD. Estos no deben ser confundidos con vectores en un sentido matemático, o vectores como los de std::vector en C++ (para esto, ver “Arraylist” en el capítulo 2). Los vectores pueden ser creados usando el built-in @Type que usamos anteriormente, y std.meta.Vector proporciona una forma abreviada para esto.

Los vectores solo pueden tener tipos secundarios de booleanos, enteros, flotantes y punteros.

Las operaciones entre vectores con el mismo tipo secundario y longitud pueden llevarse a cabo. Estas operaciones se realizan en cada uno de los valores del vector. std.meta.eql se utiliza aquí para verificar la igualdad entre dos vectores (también útil para otros tipos como estructuras).

const meta = @import("std").meta;

test "vector add" {
    const x: @Vector(4, f32) = .{ 1, -10, 20, -1 };
    const y: @Vector(4, f32) = .{ 2, 10, 0, 1 };
    const z = x + y;
    try expect(meta.eql(z, @Vector(4, f32){ 3, 0, 20, 0 }));
}

Los vectores son indexables.

test "vector indexing" {
    const x: @Vector(4, u8) = .{ 255, 0, 255, 0 };
    try expect(x[0] == 255);
}

La función integrada @splat se puede utilizar para construir un vector donde todos los valores son iguales. Aquí lo usamos para multiplicar un vector por un escalar.

test "vector * scalar" {
    const x: @Vector(3, f32) = .{ 12.5, 37.5, 2.5 };
    const y = x * @as(@Vector(3, f32), @splat(2));
    try expect(meta.eql(y, @Vector(3, f32){ 25, 75, 5 }));
}

Los vectores no tienen un campo len como los arrays, pero aún así pueden ser recorridos con un bucle.

test "vector looping" {
    const x = @Vector(4, u8){ 255, 0, 255, 0 };
    const sum = blk: {
        var tmp: u10 = 0;
        var i: u8 = 0;
        while (i < 4) : (i += 1) tmp += x[i];
        break :blk tmp;
    };
    try expect(sum == 510);
}

Los vectores se convierten a sus arrays respectivos.

const arr: [4]f32 = @Vector(4, f32){ 1, 2, 3, 4 };

Vale la pena señalar que usar vectores explícitos puede resultar en software más lento si no tomas las decisiones correctas: la auto-vectorización del compilador es bastante inteligente tal como está.

Edita esta pagina Última actualización: 5/15/2024 por Vital