Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.09.2009, 16:09   #11
SuperVisor
Павел Сергеевич
Форумчанин
 
Регистрация: 05.11.2006
Сообщений: 665
По умолчанию

Довольно полемики, коллеги )) Ждем ответа ТС. ) Если уж обсуждать все это дело - то можно тему в железе создать )))
Познавая других, мы познаем себя.
С'est la vie...
SuperVisor вне форума Ответить с цитированием
Старый 16.09.2009, 16:19   #12
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от Impuls1989 Посмотреть сообщение
Ну лесом так лесом.)))
Но мы отвлекаемся. Давайте разберемся, что толком требует от нас условие?

Насколько я понимаю мы тут можем построить только модель, и никакой реальной производительности мы не получим, а наоборот замедлим работу почти в 5 раз.
Ну немного другая постановка вопроса. ТС нужна разница между последовательным и конвейерным режимами. То есть анализ обоих вариантов, а не предпочтительного.
Немного информации можно найти здесь: http://dims.karelia.ru/x86/devel.shtml

Подтверждение моих слов о конвейере и еще кое-что: http://www.wl.unn.ru/~ragozin/diff/P4.htm
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 16.09.2009 в 16:23.
Utkin вне форума Ответить с цитированием
Старый 16.09.2009, 16:41   #13
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию

Могу предложить такой способ ковейеризации:
Имеется массив - это будет наша память (пусть он будет размером в 1024 ячеек типа int)
Есть несколько переменных (назовем их регистрами) a,b

Операция: Поместить из из память по аресу, значение в регистр (совсем не правильно, но мы не пишем реальную ассемблерную программу)))

1. Выборка команд из кэш памяти или ОЗУ (mov a,1)
2. Декодирование команды (Определяем, чего мы хотим. Тут это не нужно, а может и нужно. В общем можно поставить if)
3. Генерация адреса, при которой определяются адреса операндов в памяти (Ну это нам не надо)
4. Выполнение операции (Поместим реально информацию из ячейки с индексом 1 в переменную a)
5. Запись результата. (Эта ерундень будет совмещена с 4 пунктом)

Пример. Так как с ассемблером я почти не знаком, придумаю половину своих команд)))

a = (a-b);
b = array[3];
b = b-a
------------
mov a,1 ; Поместить в а значение из памяти с адресом 1
mov b,2 ; Поместить в b значение из памяти с адресом 2
dif a,b ; Вычесть и присвоить значение в a
mov b,3 ; Поместить в b значение из памяти с адресом 3
dif b,a ; Вычесть и присвоить значение в b

Что будет находиться в конвейере:
Код:
1 Шаг.
	1. mov a,1
	2. NULL
2 Шаг.
	1. mov b,2
	2. a = array[1]
3 Шаг.
	1. dif a,b
	2. b = array[2]
4 Шаг.
	1. mov b,3
	2. a = a-b
5 Шаг.
	1. dif b,a
	2. b = array[3]
5 Шаг.
	1. NULL
	2. b = b-a
6 Шаг 
	1. NULL
	2. NULL
Вот как-то так. Ламерски, но чтож поделаешь, такая у меня сущность)))
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Старый 16.09.2009, 21:42   #14
Olya90
Форумчанин
 
Аватар для Olya90
 
Регистрация: 16.03.2009
Сообщений: 125
По умолчанию

Ну наприпер вот так решается задание:
Типы команд: вычитание, сдвиг влево. Размер блока команд: 50, 250, 400.

Код:
#include <iostream>
#include <string>
using namespace std;
#define SUB 0
#define SHL 1

const int workTime[]={10, 15};
const string nameCommand[]={"SUB","SHL"};
const int dt = 2;
const int convSize = 20;

struct command{
	   string subName;
	   int stage;
	   int type;
	   int a, b;
	   int result;
	   };

//***********************************************

string instructionFetch(string* s, int num)
{
	return s[ num ]; 
}

int instructionDecoding(string nameCom)
{
	return nameCom == "SHL";
}

void operandReading(command &v)
{
	v.a = rand()%256;
	if (!v.type)
		v.b = rand()%256;
}

int executingCommand(command &v)
{
	if ( !v.type )
		return v.a - v.b;
	else
		return v.a << 1;
}

void writeBack(command &v, int value)
{
	v.result = value;
}
//*************************************************


int serialOperation(string* buf, int sizeBuf) //Серийная обработка
{
	 int tWorkTime = 0, tData;
	 command tCom;


     for( int i = 0; i < sizeBuf; i++)
	 {

	       tCom.stage = 0;
           tCom.subName = instructionFetch(buf, i);
		   tWorkTime += workTime[ tCom.subName == "SHL"] + dt;
		   tCom.stage++;

		   tCom.type = instructionDecoding( tCom.subName );
		   tWorkTime += workTime[ tCom.type ] + dt;
		   tCom.stage++;

		   operandReading( tCom );
		   tWorkTime += workTime[ tCom.type ] + dt;
		   tCom.stage++;

           tData = executingCommand( tCom );
           tWorkTime += workTime[ tCom.type ] + dt;
		   tCom.stage++;
 
           writeBack( tCom, tData );
		   tWorkTime += workTime[ tCom.type ] + dt;
		   tCom.stage++;
	 }
	 return tWorkTime;
}


int pipelining(string* buf, int sizeBuf) //Конвейерная обработка
{
	int tWorkTime = 0, tData[convSize], freeComInBuf = 0;
	command* tCom[convSize];
	for( int i = 0; i < convSize; i++)
		tCom[i] = NULL;
    
	while ( freeComInBuf < sizeBuf)
	{
        for( int i = 0; i < convSize; i++)
			if ( tCom[ i ] == NULL )
			{
				if (freeComInBuf < sizeBuf)
				{
				tCom[ i ] = new command;
				tCom[ i ] -> stage = 1;
				tCom[ i ] -> subName = instructionFetch(buf, freeComInBuf);
				freeComInBuf++;
				}
			} else
			{
				if ( tCom[ i ] -> stage == 1 )
				   tCom[ i ] -> type = instructionDecoding( tCom[ i ] -> subName );
				if ( tCom[ i ] -> stage == 2)
					 operandReading( *tCom[ i ] );
				if ( tCom[ i ] ->stage == 3)
					tData[ i ] = executingCommand( *tCom[ i ] );
				if ( tCom[ i ] -> stage == 4 )
					writeBack( *tCom[ i ], tData[ i ] );
				tCom[ i ] -> stage++;
				if (tCom[ i ] -> stage == 5)
				{
					delete tCom[ i ];
					tCom[ i ] = NULL;
				}
		
			}
		tWorkTime += max(workTime[0], workTime[1]) + dt;
	}

	return tWorkTime;
}



//***************************************************

void testWork(int sizeArray)
{
 	string *arr = new string[ sizeArray ];
	for( int i = 0; i < sizeArray; i++)
	    arr[ i ] = nameCommand[ ( rand()%100 ) <= 51  ] ;


	cout << endl << "Buffer size " << sizeArray 
		 << endl << "Serial operation time " << serialOperation(arr, sizeArray)
		 << endl << "Pipelining time " << pipelining( arr, sizeArray ) << endl;
	
      
   delete[] arr;
    
}

int main()
{
 	testWork(50);
	testWork(250);
	testWork(400);
 	
 	system( "pause" );
 	return 0;
}
теперь нужно разобратся с некоторыми участками кода и переделать под себя))
Если помогла нажмите на весы

Последний раз редактировалось Olya90; 16.09.2009 в 21:48.
Olya90 вне форума Ответить с цитированием
Старый 17.09.2009, 01:40   #15
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию

А в чем собственно проблеммы? Ставьте свои значения и вперед
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Старый 20.09.2009, 19:53   #16
Olya90
Форумчанин
 
Аватар для Olya90
 
Регистрация: 16.03.2009
Сообщений: 125
По умолчанию

Цитата:
Сообщение от Impuls1989 Посмотреть сообщение
А в чем собственно проблеммы? Ставьте свои значения и вперед
ага)) уже сделала
Если помогла нажмите на весы
Olya90 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
последовательный поиск по базе bosston БД в Delphi 21 26.06.2009 14:43
Edit. Последовательный переход... MoonLit Общие вопросы Delphi 22 13.02.2008 20:57
Последовательный порт RS-232 LepihinMS Общие вопросы Delphi 4 23.06.2007 00:53
Последовательный порт? Lexx Общие вопросы Delphi 4 10.05.2007 10:50
Последовательный поиск в БД Nowichok БД в Delphi 7 10.02.2007 21:55