Це інженерний зразок, тому частоти такі низькі.МОНАХ: ↑ 25.11.2025 10:40► Хай навіть це інженерний екземпляр... - я продовжую не розуміти "Шо за ужас тут тваріцца!" (С)Продуктивні P‑ядра працюють на невисокій частоті 3 ГГц, а енергоефективні E‑ядра на частоті до 2,6 ГГц.. Вони вже і Р-ядра нормальними зробити не можуть?
Новини
Останні статті і огляди
Ранній інженерний зразок Intel Panther Lake з 16 ГБ пам’яті LPDDR5X засвітився на фото
-
AntonyKandaurov
Member
- Звідки: Славетне місто Запоріжжя
-
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он постоянно лжёт называя спеки старших чипов и дополняя их ценой самого младшего обрезка
наведете подібний рівень прогресу у світі х86?clickw0w: ↑ 24.11.2025 17:17 Впрочем, обычные м-чипы (без про/макс/ультра) по сей день не могут по скорости приблизиться к даже первой про-шке. Ох уж эти жадные эппл
-
alexeygalas
Member
- Звідки: Khmelnytskyi
Так це можуть бути базові частоти відображені а не бустові. У Core Ultra 7 255H базові частоти Pcore 2Ghz а Ecore 1.5Ghz. Щоб влізти в теплопакет. Тому якщо тут базові для Pcore 3Ghz - то це вже говорить нам про немалу оптимізацію тех процесу.МОНАХ: ↑ 25.11.2025 10:40Вони вже і Р-ядра нормальними зробити не можуть?
-
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); }