Pull to refresh
27
0

devops

Send message
В своих проектах стараюсь всегда собирать с флагами:

-Werror -Wall -Wextra -pedantic -Weffc++ -Wconversion -Wsign-conversion -Wold-style-cast -Wunreachable-code -Woverloaded-virtual -Wctor-dtor-privacy -Wnon-virtual-dtor -Wenum-compare
В статье все так красиво написно(как и в других статьях про PVS-Studio)… берем инструмент запускаем на boost(или любом другом проекте), и получаем 5-10 мест с ошибками/опечатками… но это наверняка не правда.

Последний раз когда я брал в руки этот инструмент(было давно), это выглядело примерно так:
Ставим PVS-Studio, запускам студию с большим проектом… все висит… ждем, запускаем анализ… много ждем… получает 100500 сообщений… счастье не наступило… :(… (кстати после этого я студию переставлял — PVS-Studio и студия что то не поделили ...)

А не могли бы вы сделать видео вместо статьи?
По типу: тут мы ставим PVS-Studio, тут запускаем анализ на очень большом проекте X, вот все быстро отработало, вот мы отключили ложные срабатывания, а вот наши ошибки… profit!!!
Какова настройка подвески у бентли на открытый люк без опозновательных знаков?
С каждой такой новостью лишний раз убеждаюсь, что у этой страны только один выход — революция. Если это случится, то это будет страшно… но иначе никак.
Запрет сбора, хранения,… информации о чужой частной жизни

Видеорегистраторы еще можно использовать?
Но в стандартной библиотеке языка C++ длинные числа до сих пор не поддерживаются. Поэтому я решил написать её сам.

А можно воспользоваться уже готовым решением libgmp
asm volatile — это просьба к компилятору, чтобы он ничего не трогал, но к процессору это никакого отношения не имеет.
Я сам занимался данной проблемой некоторое время назад и хотелось бы поделиться своими замечаниями.

Процессор очень хитрое устройство, поэтому если писать что то такое:
ull t1 = rdtsc();
for (int i = 0; i < inner_len; i += VEC_LEN) {
записать синус angles[i] в sines[i]
}
ull t = rdtsc() - t1;

то может получиться так, что процессор поменяет инструкции местами(так как они не зависят), поэтому rdtcs() может вызваться не там где нужно и результат будет не верным.

Мое решение следующие(GCC only). Я не стал приводить весь код, только основное:

inline void start()
{
	asm volatile (  "cpuid\n\t"
					"rdtsc\n\t"
					"mov %%edx, %0\n\t"
					"mov %%eax, %1\n\t" : "=r"(time_edx), "=r"(time_eax) ::
					"%rax", "%rbx", "%rcx", "%rdx");
}

inline void stop ()
{
	asm volatile (  "rdtscp\n\t"
					"mov %%edx, %0\n\t"
					"mov %%eax, %1\n\t"
					"cpuid\n\t" : "=r"(time_edx1), "=r"(time_eax1) ::
					"%rax", "%rbx", "%rcx", "%rdx");

	time_last =
				(static_cast<unsigned long long>(time_edx1) << 32 | static_cast<unsigned long long>(time_eax1)) -
				(static_cast<unsigned long long>(time_edx)  << 32 | static_cast<unsigned long long>(time_eax));
}


Рассмотрим подробнее, как устроен данный код.

Вначале необходимо вызвать инструкцию cpuid для того, чтобы процессор не менял порядок исполнения инструкций. Затем, вызывая инструкцию rdtsc, происходит запись количества тактов процессора в регистры edx и eax.
Инструкция rdtscp читает значение количества тактов процессора и сохраняет их в регистры edx и eax, гарантируя при этом, что весь код, который находится до этой инструкции, будет выполнен. После данной инструкции, также стоит вызвать инструкцию cpuid, что бы предотвратить внеочередное исполнение инструкций.

Следует заметить, что на «замеряемое» время это ни как не повлияет, т.к. инструкция cpuid следует за инструкцией rdtscp(которая появилась только в процессорах начиная с Intel Core i7)

Подробности можно посмотреть тут: Gabriele Paoloni. How to Benchmark Code Execution Times on Intel IA-32 and IA-64 Instruction Set Architectures, September 2010
Текст нормально будет отображаться, а вот большие таблицы скорее всего не влезут.
Для таблиц два варианта: либо уменьшаем шрифт, либо переделываем таблицу — разбиваем на N таблиц, уменьшаем количество столбцов и так далее. Универсального решения не существует. Это всего лишь способ начать копать в нужном направлении.
Из за формата представления чисел с точкой. Пример на python:
Python 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 0.1 * 1 + 0.1 * 2 + 0.1 * 3 + 0.1 * 4 + 0.1 * 5 + 0.1 * 6 + 0.1 * 7 + 0.1 * 8 + 0.1 * 9
>>> b = 0.1 * (1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9)
>>> print (a, " ", b)
(4.500000000000001, ' ', 4.5)
>>> print (a == b)
False
>>>
Все верно, компилятор(VS2010) не сообразит(на счет других не знаю). Пробовал включать sse2, оптимизацию по скорости, float point model(FAST). Код изменился незначительно(функция MathCalculations):
БЫЛО:
...
fld     dword ptr [ebp+8H] 
fmul    st(0), st(0)           
fld     dword ptr [ebp+0CH]    
fld     qword ptr [?_0812]     
fmul    st(0), st(1)           
fld     st(1)                  
fmul    qword ptr [?_0811]     
fst     qword ptr [ebp-20H]    
fld     st(2)                  
fmul    qword ptr [?_0810]     
fst     qword ptr [ebp-28H]
...


СТАЛО:
...
movaps  xmm6, xmm0               
mulss   xmm6, dword ptr [?_0801] 
movss   dword ptr [ebp-4H], xmm6 
movaps  xmm2, xmm0               
mulss   xmm2, dword ptr [?_0800] 
movaps  xmm3, xmm0               
mulss   xmm3, dword ptr [?_0799] 
movaps  xmm4, xmm0               
mulss   xmm4, dword ptr [?_0798] 
movaps  xmm5, xmm0               
mulss   xmm5, dword ptr [?_0797] 
...


Полагаю, что оптимизация не получилось из-за того, что компилятор боится переставить операции местами, так как это повлияет на результат.
Как то просто выглядит функция float MathCalculations(float a, float b).

Вы уверены, что компилятор ее сам не привел к виду res = a*a*A + b*B + C? Компиляторы нынче умные… да и случай простой. Может asm покажите?
Отличный дистриб. Пользуюсь дома и на работе. Разработчикам большое спасибо за труды. Мои поздравления!
Скоро в домах, которые отапливаются кластерами будут говорить так: «Что то дома стало прохладно… пусть подкинут пару циклов в linpack»

Information

Rating
Does not participate
Location
Нижний Новгород, Нижегородская обл., Россия
Date of birth
Registered
Activity