ESP32 vs. Rapsberry Pi 2B sebesség WTF

írta: weiss, 6 éve

Vettem egy ESP32 boardot, és gondoltam megpróbálom összevetni a sebességét a raspberrymmel. Erre írtam egy nagyon egyszerű prímszámkereső programot, és eléggé meglepett az eredmény, tekintve, hogy mindkettő kb. 20-22 másodperc alatt végzett. Nem tudom hova tenni a dolgot, mivel az ESP32 csak 240 MHz-es. Mi lehet ennek az oka? :F

ESP32 Arduino kód:

void setup()
{
Serial.begin(112500);
delay(1000);

unsigned long start = millis();
int primes = 0;

for(unsigned int i = 2; i < 100000; i++)
{
bool is_prime = true;

for(unsigned int j = 2; j < i; j++)
{
if(0 == (i % j))
{
is_prime = false;
break;
}
}

if(is_prime) primes++;
}

Serial.println(millis() - start);
Serial.println(primes);
}

void loop()
{
}

raspberrys kód gcc -std=c99 -O3 -o prime -Wall prime.c opcióval fordítva:

#include <stdio.h>

int main()
{
int primes = 0;

for(unsigned int i = 2; i < 100000; i++)
{
int is_prime = 1;

for(unsigned int j = 2; j < i; j++)
{
if(0 == (i % j))
{
is_prime = 0;
break;
}
}

if(is_prime) primes++;
}

printf("%d\n", primes);

return 0;
}

A htop szerint egy magot kimaxol a progi, és az eredmények megegyeznek, szóval nem kóklerkedi el a munkát egyik sem.

Szerk.:

Azt hiszem, rájöttem a megoldásra: az ESP32-ben levő Tensilica Xtensa LX6-nak van egy REMU nevű assembly utasítása:[476. oldal], amely az osztás utáni maradékot adja vissza, ez gondolom a kriptográfiai függvények gyorsításához kell, ARM-en viszont nem találtam ilyen utasításra példát, és az egész egy __aeabi_uidivmod hívásra fordul, aminek ha jól látom, elég költséges az komplementációja.