NO MOM
I CANT PAUSE.
Scientific Number Tools Documentación
Soporte
Explorar lecciones

Suma lotes de valores con SIMD desde C++

Llamar a la API por lotes desde C++ e interpretar cada posición.

Ampliación opcional. No cuenta para completar la ruta principal.

En esta página

Objetivo: Llamar a la API por lotes desde C++ e interpretar cada posición.

Antes de empezar: Un proyecto C++; es una ampliación independiente de la interfaz Blueprint.

Ampliación opcional. Completa primero el recorrido principal y vuelve cuando necesites esta capacidad.

La idea que vas a utilizar

BatchAdd suma pares de elementos. No reduce todo el array a un único total ni demuestra rendimiento con cinco valores.

Predice antes de ejecutar

Si la primera pareja es 10 y 1, ¿el primer resultado será 11 o la suma de todos los saldos?

Construye y comprueba

Este ejercicio es para proyectos con C++. Si trabajas exclusivamente en Blueprint, puedes terminar aquí: los nodos de arrays del apartado 11 siguen siendo tu recorrido. Esta API por lotes no aparece como un conjunto equivalente de nodos Blueprint.

Vas a sumar cinco saldos con cinco incrementos, conservando un resultado por posición. No es una suma de todos los elementos en un solo total.

A. Prepara un Actor de prueba

  1. Crea una clase C++ derivada de Actor llamada MiLoteNumeros mediante el asistente de Unreal. Usa el módulo de tu juego, no el del plugin.
  2. En el archivo NombreDeTuModulo.Build.cs, añade "ScientificNumberTools" a la lista de dependencias privadas existente. Conserva las demás dependencias del proyecto.
  3. En MiLoteNumeros.cpp, añade estos includes después del include de su propia cabecera:
#include "ScientificNumber.h"
#include "ScientificNumberSIMD.h"
  1. Localiza AMiLoteNumeros::BeginPlay(). Conserva Super::BeginPlay(); y añade debajo el siguiente bloque, dentro de la función:
TArray<FScientificNumber> Saldos;
TArray<FScientificNumber> Incrementos;
for (int32 Indice = 1; Indice <= 5; ++Indice)
{
    Saldos.Add(FScientificNumber(Indice * 10.0, 0));
    Incrementos.Add(FScientificNumber(Indice, 0));
}

TArray<FScientificNumber> Resultados;
Resultados.SetNum(Saldos.Num());
FScientificNumberSIMD::BatchAdd(
    Saldos.GetData(), Incrementos.GetData(),
    Resultados.GetData(), Saldos.Num());

for (int32 Indice = 0; Indice < Resultados.Num(); ++Indice)
{
    const FScientificNumber Esperado((Indice + 1) * 11.0, 0);
    const bool Correcto = Resultados[Indice].IsSuccess()
        && Resultados[Indice] == Esperado;
    UE_LOG(LogTemp, Display, TEXT("Lote[%d]: %s"),
        Indice, Correcto ? TEXT("OK") : TEXT("ERROR"));
}
  1. Compila el proyecto con tu flujo habitual de C++. Coloca una instancia de MiLoteNumeros en el nivel y pulsa Play. Abre Output Log y busca Lote[.

Qué debes ver: cinco líneas OK, de Lote[0] a Lote[4]. Los resultados correspondientes son 11, 22, 33, 44 y 55. Puedes detenerte con un breakpoint después de BatchAdd e inspeccionar Resultados para ver su mantisa y exponente.

B. Comprueba qué representa cada posición

Cambia Indice * 10.0 por Indice * 100.0 y cambia el valor esperado de 11.0 a 101.0. Recompila y repite: los resultados serán 101, 202, 303, 404 y 505. Cada posición combina el saldo y el incremento de esa misma posición.

Ambas entradas y la salida deben disponer de al menos Count elementos; en el ejemplo se preparan cinco. BatchAdd no devuelve un bool global: comprueba el estado de cada Scientific Number resultante antes de usarlo en el juego.

Este ejercicio enseña a llamar a la API y leer su resultado. Cinco elementos no demuestran una mejora de rendimiento; el beneficio depende del tamaño de los lotes, los datos y el equipo. Úsala cuando tu código ya procese conjuntos de números, sin cambiar por ello la lógica de la cartera Blueprint.

Comprueba tu razonamiento

Ver la explicación

Será 11. Cada posición combina sus dos entradas; comprueba el estado de cada resultado.

Ahora prueba tú: Cambia una posición de entrada y predice cuál de las salidas se verá afectada.

Puedes continuar cuando: puedes justificar el tamaño de los buffers y comprobar cada resultado antes de usarlo.

Volver al recorrido y sus ampliaciones