Подсчет до 1000 В обоих ядрах проблема времени выполнения в esp32?

Я пытаюсь считать до 1000 с одним ядром и двойным ядром с esp32, но выходная доза(время выполнения) не имеет смысла, время, которое занимает одно ядро, должно быть удвоено по сравнению с двойным ядром в теории, верно?

Вот код

TaskHandle_t Task1;
TaskHandle_t Task2;
SemaphoreHandle_t baton;

int i = 0;
long l;

void setup() {

  Serial.begin(115200);
  pinMode(2, OUTPUT);
  pinMode(4, OUTPUT);

  baton = xSemaphoreCreateMutex();
  l = millis();
  xTaskCreatePinnedToCore(
    Task1code, /* Функция для реализации задачи */
    "Task1", /* Имя задачи */
    10000,  /* Размер стека в словах */
    NULL,  /* Входной параметр задачи */
    1,  /* Приоритет задачи */
    &Task1,  /* Дескриптор задачи. */
    0); /* Ядро, в котором должна выполняться задача */

//single core or dual core execution

//  xTaskCreatePinnedToCore(
//    Task2code, /* Функция для реализации задачи *
//    "Task2", /* Имя задачи */
//    10000,  /* Размер стека в словах */
//    NULL,  /* Входной параметр задачи */
//    1,  /* Приоритет задачи */
//    &Task2,  /* Дескриптор задачи. */
//    1); /* Ядро, в котором должна выполняться задача */

}
void Task1code( void * parameter) {
  while (true) {
    xSemaphoreTake(baton, portMAX_DELAY);
    xSemaphoreGive(baton);
    delay(1);// Я не понимаю, что здесь без этой команды результат вывода хуже
    i++;
    if (i == 1000) {
      l = millis()-1;
      Serial.print("Done ");
      Serial.print(xPortGetCoreID());
      Serial.print(" ");
      Serial.println(l);
      
    }if(i>1000){
      vTaskDelete(Task1);
    }
  }
}
void Task2code( void * parameter) {
  while (true) {
    xSemaphoreTake(baton, portMAX_DELAY);
    xSemaphoreGive(baton);
    delay(1);// Я не понимаю, что здесь без этой команды результат вывода хуже
    i++;
    if (i == 1000) {
      l = millis()-1;
      Serial.print("Done ");
      Serial.print(xPortGetCoreID());
      Serial.print(" ");
      Serial.println(l);
    }if(i>1000){
      vTaskDelete(Task2);
    }
  }
}
void loop() {

}

Выходные данные, которые я получаю во время выполнения

Single core :- 1033 ms
Dual core :- 701 ms

Без промедления(1); команда результат еще более очевиден

Single core :- 39 ms
Dual core :- 40 ms

Как я могу сделать так, чтобы мой алгоритм показал, что одноядерное ядро занимает в два раза больше времени, чем двухядерное, и я не хочу, чтобы оба ядра работали параллельно, а не одно за другим?

, 👍1

Обсуждение

Только одна задача может быть обновлена i сразу. Без промедления акт подсчета ничтожно мал. Это семафор, который дает вам какие-либо результаты вообще., @Majenko


2 ответа


Лучший ответ:

2

Чтобы несколько ядер обеспечивали какие-либо преимущества, они должны быть способны работать независимо. Если им требуется общий доступ к ресурсу - я в вашем эксперименте - только одно ядро может реально участвовать в работе в любой момент времени. Но поскольку их несколько, у них есть дополнительная бухгалтерия для согласования доступа к общему ресурсу. Таким образом, общая работа занимает больше времени, чем потребовалось бы одному ядру с полным доступом к ресурсу и без накладных расходов на управление доступом, чтобы выполнить работу самостоятельно.

,

Спасибо, что это помогло мне, @Avon97


2

Вы должны использовать семафор для защиты доступа на чтение/запись к i (Одновременно изменять переменную разрешается только одной задаче)

xSemaphoreTake(baton, portMAX_DELAY);
i = i + 1;
xSemaphoreGive(baton);

Кроме того, вы должны объединить свои предложения if. Если обе задачи увеличатся,это может произойти, что для второй задачи она никогда не будет иметь значения 1000.

,

Но это не ускорило время выполнения? Вот обновленный код, как вы просили https://hastebin.com/ajileyiqud.cpp, @Avon97

Прямо сейчас (без задержки) вы не смогли бы ускорить время выполнения второй задачи. Только одной задаче разрешен доступ к " я " за один раз, поэтому другая задача должна ждать и ничего не может сделать. Если вы даете задание что-то сделать (задержка), вы должны увидеть разницу., @theSealion

Я не понимаю, как получить преимущество от двухъядерных процессоров, которые у него есть?, @Avon97