Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как попасть в кэш линию проца / 4 сообщений из 4, страница 1 из 1
24.04.2017, 15:16
    #39443354
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как попасть в кэш линию проца
Пытался найти инфу про кэш линии, но кроме магической цифры 64 байта на блок ничего не нашел. Поэтому решил затестить.
ИсходникЗапускается два потока и в каждом изменение счетчика std::atomic<size_t>
счетчики берутся из массива на разном удалении друг от друга.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
#include <thread>
#include <atomic>
#include <time.h>
#include <mutex>
#include <condition_variable>

std::mutex mtx;
std::condition_variable cv;

typedef std::atomic<size_t> cnt_type_t;
//typedef volatile size_t cnt_type_t;

// Тестовый поток
void th_func(cnt_type_t* a) {
	{
		std::unique_lock<std::mutex> lck(mtx);
		cv.wait(lck);
	}
	clock_t start = clock();
	for(size_t i = 0; i < 100000000; i++) {
		(*a)++;
	}
	printf("%d ms ", (int)(clock() - start));
}

// Проверка попадания в одну кэш линию 
template <typename T1, typename T2>
bool one_cache_line(T1* x1, T2* x2) {
	size_t p1, p2;
	if((void*)x1 < (void*)x2) {
		p1 = ((size_t)x1) + sizeof(T1) - 1;
		p2 = ((size_t)x2);
	} else {
		p1 = ((size_t)x2) + sizeof(T2) - 1;
		p2 = ((size_t)x1);
	}
	return (p1 | 0x3F) == (p2 | 0x3F);
}


cnt_type_t a[256];

// Тест изменения a[i1] и a[i2] в двух потоках
bool test(size_t i1, size_t i2) {
	a[i1] = 0;
	a[i2] = 0;
	bool one = one_cache_line(&a[i1], &a[i2]);
	printf("test delta %2d compare %p %p  %s  time ", (int)(((char*)&a[i2]) - ((char*)&a[i1])), &a[i1], &a[i2], one ? "slow" : "fast");
	std::thread th1(th_func, &a[i1]), th2(th_func, &a[i2]);
	std::this_thread::sleep_for(std::chrono::milliseconds(100));
	cv.notify_all();
	th1.join();
	th2.join();
	printf("\n");
	if (a[i1] != a[i2]) printf("ERROR\n");
	return one;
}

int main() { 
	printf("size %d\n", (int)sizeof(std::atomic<size_t>));
	for (size_t j = 0; j < 8; j++) {
		for(size_t i = j; i < j + 17; i++) {
			if(!test(j, i)) break;
		}
	}
	system("pause");
	return 0;
}


Интересовало как именно блоки берутся процом. Оказалось берутся блоки с адресов кратных 64.
В тесте есть функция one_cache_line(T1* x1, T2* x2) возвращает true если обе переменные попали в одну кэшлинию.
Результат std::atomic<size_t> MSVC 2015 x64 проц i7 6700K 4 ГГц
delta - растояние в байтах между счетчиками
compare - адреса счетчиков в памяти
slow/fast - предсказание функцией one_cache_line()
time - время работы каждого потока

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
size 8 (размер счетчика)
test delta  0 compare 00007FF6C4041D20 00007FF6C4041D20  slow  time 3111 ms 3122 ms 
test delta  8 compare 00007FF6C4041D20 00007FF6C4041D28  slow  time 2988 ms 2997 ms 
test delta 16 compare 00007FF6C4041D20 00007FF6C4041D30  slow  time 3074 ms 3081 ms 
test delta 24 compare 00007FF6C4041D20 00007FF6C4041D38  slow  time 3007 ms 3023 ms 
test delta 32 compare 00007FF6C4041D20 00007FF6C4041D40  fast  time 457 ms 457 ms 
test delta  0 compare 00007FF6C4041D28 00007FF6C4041D28  slow  time 3072 ms 3090 ms 
test delta  8 compare 00007FF6C4041D28 00007FF6C4041D30  slow  time 3126 ms 3136 ms 
test delta 16 compare 00007FF6C4041D28 00007FF6C4041D38  slow  time 3074 ms 3091 ms 
test delta 24 compare 00007FF6C4041D28 00007FF6C4041D40  fast  time 463 ms 464 ms 
test delta  0 compare 00007FF6C4041D30 00007FF6C4041D30  slow  time 3112 ms 3122 ms 
test delta  8 compare 00007FF6C4041D30 00007FF6C4041D38  slow  time 3113 ms 3116 ms 
test delta 16 compare 00007FF6C4041D30 00007FF6C4041D40  fast  time 478 ms 478 ms 
test delta  0 compare 00007FF6C4041D38 00007FF6C4041D38  slow  time 2975 ms 3003 ms 
test delta  8 compare 00007FF6C4041D38 00007FF6C4041D40  fast  time 456 ms 456 ms 
test delta  0 compare 00007FF6C4041D40 00007FF6C4041D40  slow  time 3827 ms 3828 ms 
test delta  8 compare 00007FF6C4041D40 00007FF6C4041D48  slow  time 3685 ms 3686 ms 
test delta 16 compare 00007FF6C4041D40 00007FF6C4041D50  slow  time 3848 ms 3848 ms 
test delta 24 compare 00007FF6C4041D40 00007FF6C4041D58  slow  time 3823 ms 3823 ms 
test delta 32 compare 00007FF6C4041D40 00007FF6C4041D60  slow  time 3850 ms 3851 ms 
test delta 40 compare 00007FF6C4041D40 00007FF6C4041D68  slow  time 3810 ms 3812 ms 
test delta 48 compare 00007FF6C4041D40 00007FF6C4041D70  slow  time 3699 ms 3700 ms 
test delta 56 compare 00007FF6C4041D40 00007FF6C4041D78  slow  time 3824 ms 3825 ms 
test delta 64 compare 00007FF6C4041D40 00007FF6C4041D80  fast  time 456 ms 456 ms 
test delta  0 compare 00007FF6C4041D48 00007FF6C4041D48  slow  time 3828 ms 3829 ms 
test delta  8 compare 00007FF6C4041D48 00007FF6C4041D50  slow  time 3818 ms 3819 ms 
test delta 16 compare 00007FF6C4041D48 00007FF6C4041D58  slow  time 3665 ms 3667 ms 
test delta 24 compare 00007FF6C4041D48 00007FF6C4041D60  slow  time 3678 ms 3683 ms 
test delta 32 compare 00007FF6C4041D48 00007FF6C4041D68  slow  time 3696 ms 3697 ms 
test delta 40 compare 00007FF6C4041D48 00007FF6C4041D70  slow  time 3818 ms 3821 ms 
test delta 48 compare 00007FF6C4041D48 00007FF6C4041D78  slow  time 3776 ms 3776 ms 
test delta 56 compare 00007FF6C4041D48 00007FF6C4041D80  fast  time 470 ms 470 ms 
test delta  0 compare 00007FF6C4041D50 00007FF6C4041D50  slow  time 3691 ms 3693 ms 
test delta  8 compare 00007FF6C4041D50 00007FF6C4041D58  slow  time 3650 ms 3652 ms 
test delta 16 compare 00007FF6C4041D50 00007FF6C4041D60  slow  time 3720 ms 3721 ms 
test delta 24 compare 00007FF6C4041D50 00007FF6C4041D68  slow  time 3845 ms 3845 ms 
test delta 32 compare 00007FF6C4041D50 00007FF6C4041D70  slow  time 3691 ms 3695 ms 
test delta 40 compare 00007FF6C4041D50 00007FF6C4041D78  slow  time 3685 ms 3686 ms 
test delta 48 compare 00007FF6C4041D50 00007FF6C4041D80  fast  time 474 ms 474 ms 
test delta  0 compare 00007FF6C4041D58 00007FF6C4041D58  slow  time 3848 ms 3848 ms 
test delta  8 compare 00007FF6C4041D58 00007FF6C4041D60  slow  time 3703 ms 3704 ms 
test delta 16 compare 00007FF6C4041D58 00007FF6C4041D68  slow  time 3693 ms 3694 ms 
test delta 24 compare 00007FF6C4041D58 00007FF6C4041D70  slow  time 3829 ms 3829 ms 
test delta 32 compare 00007FF6C4041D58 00007FF6C4041D78  slow  time 3820 ms 3820 ms 
test delta 40 compare 00007FF6C4041D58 00007FF6C4041D80  fast  time 473 ms 474 ms 

Интересные результаты по времени на разных процах (все без HT)
ПроцессорОдна линияРазныеi7 6700K 4 ГГц3000-3800 мс455-475 мсi7 3770K 3.5 ГГц2900-3500 мс585-595 мсCore2Duo E8400 3 ГГц2700-3100 мс675-695 мс
Странные цифры: в разных кэшлиниях новые процы быстрее, а если в одну попало, то почему-то наоборот.

И пропорция совсем некрасивая, при попадание в одну кэшлинию тормоза в 5-7 раз, если честно не ожидал такой большой разницы.

Интересный момент там где "delta 0" это один и тот же счетчик на оба потока, по идее должно быть медленнее, но время такое же как и с разными.

Еще один тест со счетчиками volatile size_t
Результат с volatile size_t
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
size 8
test delta  0 compare 00007FF68DA11CF0 00007FF68DA11CF0  slow  time 202 ms 211 ms 
test delta  8 compare 00007FF68DA11CF0 00007FF68DA11CF8  slow  time 201 ms 206 ms 
test delta 16 compare 00007FF68DA11CF0 00007FF68DA11D00  fast  time 164 ms 164 ms 
test delta  0 compare 00007FF68DA11CF8 00007FF68DA11CF8  slow  time 207 ms 208 ms 
test delta  8 compare 00007FF68DA11CF8 00007FF68DA11D00  fast  time 143 ms 143 ms 
test delta  0 compare 00007FF68DA11D00 00007FF68DA11D00  slow  time 215 ms 215 ms 
test delta  8 compare 00007FF68DA11D00 00007FF68DA11D08  slow  time 205 ms 210 ms 
test delta 16 compare 00007FF68DA11D00 00007FF68DA11D10  slow  time 229 ms 231 ms 
test delta 24 compare 00007FF68DA11D00 00007FF68DA11D18  slow  time 206 ms 208 ms 
test delta 32 compare 00007FF68DA11D00 00007FF68DA11D20  slow  time 228 ms 231 ms 
test delta 40 compare 00007FF68DA11D00 00007FF68DA11D28  slow  time 233 ms 234 ms 
test delta 48 compare 00007FF68DA11D00 00007FF68DA11D30  slow  time 225 ms 229 ms 
test delta 56 compare 00007FF68DA11D00 00007FF68DA11D38  slow  time 207 ms 207 ms 
test delta 64 compare 00007FF68DA11D00 00007FF68DA11D40  fast  time 151 ms 151 ms 
test delta  0 compare 00007FF68DA11D08 00007FF68DA11D08  slow  time 207 ms 209 ms 
test delta  8 compare 00007FF68DA11D08 00007FF68DA11D10  slow  time 229 ms 233 ms 
test delta 16 compare 00007FF68DA11D08 00007FF68DA11D18  slow  time 204 ms 210 ms 
test delta 24 compare 00007FF68DA11D08 00007FF68DA11D20  slow  time 230 ms 234 ms 
test delta 32 compare 00007FF68DA11D08 00007FF68DA11D28  slow  time 231 ms 234 ms 
test delta 40 compare 00007FF68DA11D08 00007FF68DA11D30  slow  time 229 ms 231 ms 
test delta 48 compare 00007FF68DA11D08 00007FF68DA11D38  slow  time 224 ms 225 ms 
test delta 56 compare 00007FF68DA11D08 00007FF68DA11D40  fast  time 166 ms 166 ms 
test delta  0 compare 00007FF68DA11D10 00007FF68DA11D10  slow  time 210 ms 210 ms 
test delta  8 compare 00007FF68DA11D10 00007FF68DA11D18  slow  time 204 ms 209 ms 
test delta 16 compare 00007FF68DA11D10 00007FF68DA11D20  slow  time 206 ms 211 ms 
test delta 24 compare 00007FF68DA11D10 00007FF68DA11D28  slow  time 206 ms 209 ms 
test delta 32 compare 00007FF68DA11D10 00007FF68DA11D30  slow  time 230 ms 233 ms 
test delta 40 compare 00007FF68DA11D10 00007FF68DA11D38  slow  time 224 ms 238 ms 
test delta 48 compare 00007FF68DA11D10 00007FF68DA11D40  fast  time 143 ms 143 ms 
test delta  0 compare 00007FF68DA11D18 00007FF68DA11D18  slow  time 205 ms 211 ms 
test delta  8 compare 00007FF68DA11D18 00007FF68DA11D20  slow  time 201 ms 212 ms 
test delta 16 compare 00007FF68DA11D18 00007FF68DA11D28  slow  time 206 ms 213 ms 
test delta 24 compare 00007FF68DA11D18 00007FF68DA11D30  slow  time 200 ms 212 ms 
test delta 32 compare 00007FF68DA11D18 00007FF68DA11D38  slow  time 234 ms 237 ms 
test delta 40 compare 00007FF68DA11D18 00007FF68DA11D40  fast  time 166 ms 166 ms 
test delta  0 compare 00007FF68DA11D20 00007FF68DA11D20  slow  time 204 ms 207 ms 
test delta  8 compare 00007FF68DA11D20 00007FF68DA11D28  slow  time 204 ms 204 ms 
test delta 16 compare 00007FF68DA11D20 00007FF68DA11D30  slow  time 228 ms 235 ms 
test delta 24 compare 00007FF68DA11D20 00007FF68DA11D38  slow  time 226 ms 235 ms 
test delta 32 compare 00007FF68DA11D20 00007FF68DA11D40  fast  time 142 ms 143 ms 
test delta  0 compare 00007FF68DA11D28 00007FF68DA11D28  slow  time 226 ms 236 ms 
test delta  8 compare 00007FF68DA11D28 00007FF68DA11D30  slow  time 210 ms 212 ms 
test delta 16 compare 00007FF68DA11D28 00007FF68DA11D38  slow  time 207 ms 208 ms 
test delta 24 compare 00007FF68DA11D28 00007FF68DA11D40  fast  time 167 ms 167 ms 

Время такое
ПроцессорОдна линияРазныеi7 6700K 4 ГГц207-230 мс143-167 мсi7 3770K 3.5 ГГц218-220 мс202-220 мсCore2Duo E8400 3 ГГц213-228 мс202-220 мс
PS Как затестить обычную работу не придумал.
...
Рейтинг: 0 / 0
24.04.2017, 15:59
    #39443410
Вася Уткин
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как попасть в кэш линию проца
Dima TИнтересные результаты по времени на разных процах (все без HT)
ПроцессорОдна линияРазныеi7 6700K 4 ГГц3000-3800 мс455-475 мсi7 3770K 3.5 ГГц2900-3500 мс585-595 мсCore2Duo E8400 3 ГГц2700-3100 мс675-695 мс
Странные цифры: в разных кэшлиниях новые процы быстрее, а если в одну попало, то почему-то наоборот.

И пропорция совсем некрасивая, при попадание в одну кэшлинию тормоза в 5-7 раз, если честно не ожидал такой большой разницы.

Интересный момент там где "delta 0" это один и тот же счетчик на оба потока, по идее должно быть медленнее, но время такое же как и с разными.
1. На новых процах уровней кэша больше - 3 а не 2:
- Core2Duo E8400 - Cache 6 MB L2 - только 2 уровня
- i7 3770K и i7 6700K - Cache 8 MB SmartCache - 3 уровня

2. "при попадание в одну кэшлинию тормоза в 5-7 раз"

- при изменении одной кэш линии - она каждый раз гоняется от одного ядра к другому в единственном экземпляре в состоянии E-Intel / O-AMD,
путь ->(запрос)L1->L2->L3->QPI->L3->L2->L1 -> (ответ) ->L1->L2->L3->QPI->L3->L2->L1->

- при изменении разных кэш линий - одна кэш линия всегда в L1 ядра-1, а вторая в L1 ядра-2, путь ->(запрос)L1(ответ)->


3. " где "delta 0" это один и тот же счетчик на оба потока, по идее должно быть медленнее, но время такое же как и с разными ."
где delta 0 - там вообще-то медленно как и с одинаковыми в вашем тесте

test delta 32 compare 00007FF6C4041D20 00007FF6C4041D40 fast time 457 ms 457 ms
test delta 0 compare 00007FF6C4041D28 00007FF6C4041D28 slow time 3072 ms 3090 ms
test delta 8 compare 00007FF6C4041D28 00007FF6C4041D30 slow time 3126 ms 3136 ms
...
Рейтинг: 0 / 0
24.04.2017, 16:11
    #39443427
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как попасть в кэш линию проца
Вася Уткин3. " где "delta 0" это один и тот же счетчик на оба потока, по идее должно быть медленнее, но время такое же как и с разными ."
Коряво написал. Хотел сказать "с разными счетчиками в одной кэш.линии".
Т.е. для std::atomic<size_t> по времени без разницы менять один счетчик из разных потоков или два разных, но оба в одной кэш.линии. Ожидал что конкуренция за счетчик добавит тормозов.
...
Рейтинг: 0 / 0
24.04.2017, 16:16
    #39443436
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как попасть в кэш линию проца
Вася Уткин- при изменении одной кэш линии - она каждый раз гоняется от одного ядра к другому в единственном экземпляре в состоянии E-Intel / O-AMD,
путь ->(запрос)L1->L2->L3->QPI->L3->L2->L1 -> (ответ) ->L1->L2->L3->QPI->L3->L2->L1->
Спасибо за разъяснения. Теперь понятно почему при использовании одного общего счетчика время не добавилось.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как попасть в кэш линию проца / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]