Opracowuję algorytmy przetwarzania obrazu (używając GCC, kierując ARMv7 (Raspberry Pi 2B)).Szybkie wyszukiwanie/zamiana pasujących pojedynczych bajtów w tablicy 8-bitowej, na ARM
W szczególności używam prostego algorytmu, który zmienia się indeks w masce:
void ChangeIndex(uint8_t * mask, size_t size, uint8_t oldIndex, uint8_t newIndex)
{
for(size_t i = 0; i < size; ++i)
{
if(mask[i] == oldIndex)
mask[i] = newIndex;
}
}
Niestety to ma słabą wydajność platformy docelowej.
Czy istnieje sposób na jej optymalizację?
Nie od razu oczywiste, jak sprawić, że szybciej - nie może być sztuczek, jeśli wiesz więcej o danych - na przykład, można mieć listę komórek zawierających wartość 'X' - ale jest to bardzo przydatne, jeśli liczba" trafień "jest dość niska - jeśli trafisz na większość wpisów w" masce "pasujących do" oldIndex ", to raczej nie przyspieszysz. Jaka jest wartość "size" i ile procent tabeli ma przeciętnie wartość "oldIndex"? –
Jakie opcje kompilatora są używane? Upewnij się, że instruujesz go, aby używał instrukcji NEON ("-mfpu = neon-vfpv4", w przeciwnym razie może generować kod zgodny ze starszymi procesorami, które nie mają NEON. – Gilles
Powinieneś również uzyskać pewne przyspieszenie za pomocą potrójnego operatora: 'mask [i] = (mask [i] == oldIndex)? newIndex: mask [i]; ' – Miki