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?
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.