· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.A&O —› Устранение зависимости по данным

<< . 1 . 2 . 3 . 4 . 5 . >>

Посл.отвђт Сообщенiе


Дата: Ноя 20, 2003 14:41:29

Короче, я устал спорить ни о чем. Нет, ты не прав с хеш таблицей. Топай на RSDN, читай там статьи, а только потом садись спорить.

Володя не страдай :)_))


Дата: Ноя 20, 2003 17:33:16

Edmond

Йес, сэр :)


Дата: Ноя 20, 2003 17:33:16 · Поправил: volodya

!


Дата: Ноя 20, 2003 18:24:54 · Поправил: masquer

Я прикинул код на ассемблере и вынужден поправиться - со внутренним циклом не все так просто, у меня пока так получилось. Не знаю точно всего задания, но приведенный участок особо не улучшишь - всю задачу смотреть можно, тогда уже и алгоритмически что-то можно будет переделать.
	lea esi, mas1
	lea edi, mas2
	xor eax, eax
	mov ecx, per
	add esi, ecx
@@:	mov ebx, per2
	add eax, [esi]
	add esi, per3
	dec ebx
	jnz @B
	mov [edi], eax
	add esi, per
	add edi, 4
	dec ecx
	jnz @B


Дата: Ноя 20, 2003 23:36:23

masquer
У тебя вроде код не совсем соответствует исходному.
1. Index - это индекс в массиве, а не указатель на память.
Т.е. per и per3 надо умножать на 4 перед прибавлением.
2. Вместо строки
index=i+per;
у тебя получается
index=i*(per+per2*per3);

Можно так попробовать:
	lea	edi, mas2
	mov	edx, per3
	shl	edx, 2		;edx = 4*per3
	mov	ebp, per2
	imul	ebp,edx
	lea	esi, [ebp+4*ecx+offset mas1]	;esi = mas1+4*per+4*per2*per3
	neg	ebp		
	xor	eax, eax
	mov	ecx, per
L10:
	mov	ebx,ebp		;ebx = -4*per2*per3
L20:	add	eax, [esi+ebx]
	add	ebx, edx
	jnz	L20
	mov	[edi], eax
	add	esi, 4
	add	edi, 4
	dec	ecx
	jnz	L10


Дата: Ноя 21, 2003 01:52:52

_G3
Вот как раз этот код и соответствует 2 разовому приросту производительности.
Так а дальше?? это и все?? ЗНАЧИТ ЗАВИСИМОСТЬ ПО ДАННЫМ не побеждаема???


Дата: Ноя 21, 2003 09:56:34

Можно добавить временный массив для увеличения производительности:
int sum[]=new int[per3];
for(i=0;i<per3;i++)
   sum[i]=0;
int n=per2*per3;
for(i=0;i<n;i+=per3)
   for(j=0;j<per3;j++)
     sum[j]+=mas1[i+j];
int m=per/per3;
int r=per%per3;
for(int i=0;i<m;i+=per3)
  for(j=0;j<per3;j++)
  {
    summa+=sum[j];
    sum[j]+=mas1[per+i+j+n]-mas1[per+i+j];
    mas2[i+j]=summa;
  }
for(j=0;j<r;j++)
{
  summa+=sum[j];
  mas2[m+j]=summa;
}
delete[] sum;

Только new стоит заменить на что нибудь побыстрее.


Дата: Ноя 21, 2003 13:32:50

Black_mirror
нет... этот код проигрывает в полторв раза!! Видимо из-за ветвлений!!!


Дата: Ноя 21, 2003 14:58:16

emergenter
Ты-бы тогда процедуру измерения скорости обнародовал. А то у меня опять все не как у людей - вариант G3 только чуть быстрее оригинала, скомпилированного Интеловским компилером. А при определенных значениях параметров даже ему проигрывает. Ну или хотя-бы скажи, на каких приблизительно параметрах ты хотел-бы это оптимизировать. На всех сразу ведь не получится.

Если par>par3 - то ты обращаешься по нескольку раз к одной ячейке и нужно менять алгоритм.

Если размер mas1 большой, то к концу подсчета summa кеш-линейка, содержащая первые слагаемые, будет вытеснена из кеша, и при подсчете следующей summa будет загружена заново - тогда имеет смысл обрабатывать mas1 блоками (максимальный размер блока зависит от par3, размера L1 кэша и (не уверен)его ассоциативности)


Дата: Ноя 21, 2003 15:28:06

emergenter
Вообще говоря, если дело касается книги Криса то там есть одно СТРАНННОЕ место.
Но в частности.

Я не понял, что ВЫ ЖЕЛАЕТЕ ВЫЙГРАТЬ???

И потом. Я до сих не вижу ОБЪЯСНЕНИЯ КОДА. Когда его ждать?


Дата: Ноя 21, 2003 15:54:30

Вообще говоря, если дело касается книги Криса то там есть одно СТРАНННОЕ место.

Например, страница 160, второй абзац.
Не смешно ?


Дата: Ноя 21, 2003 16:00:36

Shur
Нет, не смешно.
Если бы вот так конкретно можно было бы сказать.
Это размазано в двух темах.

Во первых..

1. Копирование с шагом 32 байта -- оптимально с одной строны

2. И не оптимально с другой

И пойди пойми как ЭТО ПОНИМАТЬ!!!!!!

Но я пока хочу ему (Крису) этот вопрос задать...


Дата: Ноя 21, 2003 16:04:30

Edmond
А что собственно с кодом? Там элементарный цикл с выбиранием значений из массива... но выбираются не по порядку а в разброс. Это разброс и определяется по формуле....


Дата: Ноя 21, 2003 17:52:45

Edmond
Да я согласен. Тут нужно знать изначально что за задача и какие примерно числа будут присвоены переменным.


Дата: Ноя 21, 2003 18:35:40

emergenter
А если per увеличить в 100 раз? 8)

<< . 1 . 2 . 3 . 4 . 5 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.043