Ранній інженерний зразок Intel Panther Lake з 16 ГБ пам’яті LPDDR5X засвітився на фото

Обсуждение статей и новостей сайта
Автор
Сообщение
AntonyKandaurov
Member
Аватара пользователя
Откуда: Славетне місто Запоріжжя

Сообщение

МОНАХ: 25.11.2025 10:40
Продуктивні P‑ядра працюють на невисокій частоті 3 ГГц, а енергоефективні E‑ядра на частоті до 2,6 ГГц.
► Хай навіть це інженерний екземпляр... - я продовжую не розуміти "Шо за ужас тут тваріцца!" (С) :insane: . Вони вже і Р-ядра нормальними зробити не можуть?
Це інженерний зразок, тому частоти такі низькі.
yuriy_dd
Member

Сообщение

alexeygalas: 24.11.2025 15:57І в M4 ти отримуєш 8 каналів загальною ПСП 120 Гб/c як у 2 каналів LPDDR5X 8400
а скільки каналів памяті потрібно щоб максимально пришвидшити виконання команди?:
a = b + c + d + e + f + g + h + i;

всі зміні - не в кеші чи регітрах
clickw0w: 24.11.2025 17:17он постоянно лжёт называя спеки старших чипов и дополняя их ценой самого младшего обрезка
десь конкретно ви мене зловили?
clickw0w: 24.11.2025 17:17 Впрочем, обычные м-чипы (без про/макс/ультра) по сей день не могут по скорости приблизиться к даже первой про-шке. Ох уж эти жадные эппл :)
наведете подібний рівень прогресу у світі х86?
alexeygalas
Member
Аватара пользователя
Откуда: Khmelnytskyi

Сообщение

МОНАХ: 25.11.2025 10:40Вони вже і Р-ядра нормальними зробити не можуть?
Так це можуть бути базові частоти відображені а не бустові. У Core Ultra 7 255H базові частоти Pcore 2Ghz а Ecore 1.5Ghz. Щоб влізти в теплопакет. Тому якщо тут базові для Pcore 3Ghz - то це вже говорить нам про немалу оптимізацію тех процесу.
Denvys5
Member
Аватара пользователя
Откуда: Kyiv

Сообщение

yuriy_dd: 25.11.2025 14:31а скільки каналів памяті потрібно щоб максимально пришвидшити виконання команди?:
a = b + c + d + e + f + g + h + i;
один
Всі 8 змінних збираються у один 64-байтний пакет який один 64-бітний канал видає за 8 тактів, збираючі данні по банк-групам за ще тактів ~50

Багатоканальність (при однаковій ширині шини) працює тільки коли формується декілька конкуруючих черг запитів а об'єм запитуваних даних малий (меньше за 64 байт блок)
yuriy_dd
Member

Сообщение

Denvys5: 25.11.2025 15:20Багатоканальність (при однаковій ширині шини) працює тільки коли формується декілька конкуруючих черг запитів
чудово, що хоч з кимось є про що говорити

зможете написати код (наприклад на С) щоб показати чи один потік може використати / виграти від багатьох каналів памяті?

ось мій приклад коду - але він читає по 32 чи 64 біти. Канали у М4 - 16ти бітні, тобто якщо читати по 16 біт - виграш має бути ще більшим:
спойлер

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <time.h>
#include <locale.h>
#include <sys/time.h>
  
static inline double NowSec()
{
  struct timeval tv;
  gettimeofday(&tv, NULL);
  return tv.tv_sec + tv.tv_usec * 1e-6;
}
  
#define ACCESS_TYPE uint64_t
//#define ACCESS_TYPE uint32_t
  
#define MAX_LANE_COUNT 64
  
// Prepare a random pointer-chasing cycle
void Prepare(ACCESS_TYPE *ABuf, size_t AElementCount) {
  for (size_t i = 0; i < AElementCount; i++)
    ABuf[i] = (i + 1);
  ABuf[AElementCount - 1] = 0;
  
  // Fisher–Yates shuffle - to avoid prefetcher
  for (size_t i = AElementCount - 1; i > 0; i--)
  {
    size_t j = rand() % (i + 1);
    ACCESS_TYPE tmp = ABuf[i];
    ABuf[i] = ABuf[j];
    ABuf[j] = tmp;
  }
}
  
void Test(int ALaneCount, size_t AElementCount, ACCESS_TYPE *ABuf)
{
  ACCESS_TYPE LIdx[MAX_LANE_COUNT] = {0};
  for (int i = 0; i < ALaneCount; i++)
    LIdx[i] = rand() % AElementCount;//i;
  
  double LStarted = NowSec();
  size_t LIterCount = 200000000 / ALaneCount;
  for (size_t k = 0; k < LIterCount; k++)
    for (int i = 0; i < ALaneCount; i++)
      LIdx[i] = ABuf[LIdx[i]];
  
  uint64_t LSum = 0;
  for (int i = 0; i < ALaneCount; i++)
    LSum += LIdx[i];
  if(LSum < 1)
    printf("%'llu\n", LSum);
  
  double LElapsed = NowSec() - LStarted;
  double LAccessCount = (double)LIterCount * ALaneCount;
  printf("Lanes=%2d, time=%6.3f s, %6.2f ns/access, %6.3f GB/s\n",
    ALaneCount,
    LElapsed,
    (LElapsed * 1e9) / LAccessCount,
    LAccessCount * sizeof(ACCESS_TYPE) / (1024 * 1024 * 1024) / LElapsed
  );
}
  
int main(int argc, char **argv)
{
  setlocale(LC_NUMERIC, "en_US.UTF-8");
  
  size_t LBufSize = 1024 * 1024 * 1024;//2U * 1024 * 1024 * 1024;
  size_t LElementCount = LBufSize / sizeof(ACCESS_TYPE);
  
  printf("sizeof(ACCESS_TYPE): %zu\n", sizeof(ACCESS_TYPE));
  
  ACCESS_TYPE *LBuf = aligned_alloc(64, LBufSize);
  printf("Allocated Buf: %'zu\n", LBufSize);
  if (!LBuf)
  {
    perror("alloc");
    return 1;
  }
  
  double LStarted = NowSec();
  Prepare(LBuf, LElementCount);
  printf("Prepared Buf in: %.3f s\n", NowSec() - LStarted);
  
  for(int LLaneCount = 1; LLaneCount <= MAX_LANE_COUNT; LLaneCount++)
    Test(LLaneCount, LElementCount, LBuf);
  
  free(LBuf);
}
Ответить