Это инструкция по конвейерной обработке Intel?

A int* является указателем на целое число.

int[3] представляет собой массив из 3 целых чисел.

Массив из 3 целых чисел «распадается» при падении шапки к указателю на первый элемент.

Когда вы делаете push_back(msmTemp), вы нажимаете указатель на первый элемент msmTemp в vector.

Указатели на C ++ не владеют тем, на что указывают. Вектор afte двух push_backs содержит два указателя, оба они относятся к одному и тому же массиву msmTemp.

Когда вы позже перебираете вектор, вы получаете по очереди два указателя. Каждый указывает на msmTemp.

Затем вы используете [] для индексации этих указателей. Когда у вас есть указатель на первый элемент массива, вы можете использовать [] для доступа к другим элементам массива. [0] - это первый элемент, [1] второй и т. д.

Итак, вы смотрите на 3 элемента в msmTemp (к счастью, оно имеет 3) и смотрите на них дважды, потому что у вас есть два указатели в него в вектор.

Вы можете вставлять такие элементы:

std::vector<int> matchVector;
int msmTemp[3];
msmTemp[0]={1};
msmTemp[1]={2};
msmTemp[2]={3};
matchVector.insert( matchVector.end(), std::begin(msmTemp), std::end(msmTemp) );

и т. д. Это заканчивается вектором, содержащим 6 элементов, а не два массива.

Если вам нужны массивы в качестве значений, которые вам нужны std::array:

std::vector< std::array<int,3> > matchVector;
std::array<int, 3> msmTemp;

, а затем ваш код работает как написанный , std::array - это тип библиотеки, который действует как сырой массив, но у него нет проблем с распадом на указатель для необработанного массива.

0
задан Jiwon 19 January 2019 в 11:48
поделиться

1 ответ

Самые первые компьютеры не были конвейерными. Они получили инструкцию, выполнили все циклы, требуемые инструкциями, и передали следующую инструкцию. В среднем на инструкцию требуется 5-6 циклов. Такое поведение было справедливо для всех компьютеров вплоть до середины 80-х годов, включая 8086 (представленный в 78).

В конце семидесятых люди обнаружили, что конвейер является эффективным способом повышения эффективности. Первым коммерческим чипом была IBM 801, но успех конвейера был с Sun Sparc, Berkeley Risc и MIPS, в середине восьмидесятых.

Идея состоит в том, чтобы разделить все инструкции на одинаковые этапы и связать эти этапы с независимыми ресурсами HW таким образом, чтобы вы могли начать новую инструкцию, не дожидаясь завершения предыдущей, что позволяет начать новую инструкцию за цикл. Чтобы справиться с взаимодействием команд (опасностями), это больше 1 инструкции каждые ~ 1,5 цикла, но выигрыш по сравнению с предыдущим поколением огромен (производительность X3).

Проблема заключается в том, что конвейерная обработка требует специальных наборов инструкций, основанных на простом перемещении данных (называемых наборами команд RISC). Новые компьютеры были основаны на этой схеме, но наборы инструкций старых процессоров не были адаптированы (включая x86).

Чтобы получить выгоду от конвейерного преимущества, сохраняя совместимость с восходящей версией, Intel решила создать микроархитектуру, основанную на двух частях: первая получает инструкции x86 и переводит их в конвейерные (называемые & mu; Ops), а вторая один из них - конвейерное выполнение этих операций. Впервые он был представлен в Pentium Pro (представлен в 1995 году) и присутствует во всех последующих версиях.

Код, который вы даете

lea 0x7 (% eax),% ecx

, переведенный в

, добавляет $ 0x7 ,% eax;
lea% eax,% ecx

является примером перевода & mu; Ops. Перевод особенно полезен, если преобразовать операции ALU с операндом в памяти в более простые операции, выполняющие одну задачу (передача памяти или операция ALU).

В настоящее время все компьютеры являются конвейерными (за исключением некоторых простых & mu; контроллеров или некоторых процессоров, встроенных в FPGA).

Какую бы последовательность инструкций вы не выполняли, они будут выполняться по конвейеру, включая, конечно, те, которые заданы вами. Единственным ограничением является то, что в зависимости от взаимодействия команд могут быть опасности, которые могут привести к замедлению (остановке) конвейера.

Я думаю, что приведенный выше пример соответствует определению конвейерной обработки intel 8086

Конвейер - это характеристика микроархитектуры, а не набора команд. Таким образом, микроархитектура 8086 НЕ была конвейерной, но последующие архитектурные реализации ее набора команд (называемые x86 или IA32) таковы.

, потому что он выполняет несколько инструкций в одном временном интервале

Вы действительно правы, и несколько инструкций могут быть запущены в одном временном интервале, но это еще один метод выше конвейера разрешить параллельное выполнение на уровне команд и называется суперскалярным.

0
ответ дан Alain Merigot 19 January 2019 в 11:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: