Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: математика, вычисления
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
Кристина33
12 / 12 / 0
Регистрация: 06.06.2010
Сообщений: 50
1

Найти сумму чисел матрицы двумя способами с mmx и без

13.05.2011, 09:17. Просмотров 644. Ответов 3
Метки нет (Все метки)

задание в том что нужно найти сумму чисел матрицы двумя способами с mmx и без...я вроде написала но у меня почему то разные результаты.где ошибка?второй способ правильно работает,а первый нет!

C++
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
 #include "stdafx.h"
 
 
 #include "stdio.h"
 #include "windows.h"
 int main(int argc, char* argv[])
 {
 short a_array[4][4]; //матрица 4*4
 short cnt = 16; //число эл-тов
 int res = 0, res1 = 0; 
 int Time1, Time2, Delay1; //для хранения времени
 double Speedup;
 for (int i=0; i<4; i++)
 for (int j=0; j<4; j++)
 
 {
 a_array[i][j] = i*4+j;
 }
 printf("\nScalar product with or without MMX...\n\n");
 printf("\nResult = %d\n", res);
 printf("Result1 = %d\n", res1);
 Time1 = GetTickCount();
 
 for (i=0; i<10000000; i++)
 {
 cnt = 16;
 __asm
 {
 push eax
 push ecx
 push esi
 xor esi, esi
 pxor MM7, MM7
 loop1:
 movq MM0, a_array[esi]
 movq MM1, MM0
 pmaddwd MM0, MM1
 paddd MM7, MM0
 add esi, 8
 sub cnt, 4
 jnz loop1
 movq MM0, MM7
 psrlq MM7, 32
 paddd MM7, MM0
 movd res, MM7
 emms
 pop esi
 pop ecx
 pop eax
 }
 }
 Time2 = GetTickCount();
 
 printf("\n Using MMX ...\n");
 printf("\nResult = %d", res);
 Delay1 = Time2 - Time1;
 printf("\nTime elapsed = %d ms\n", Delay1);
 
 Time1 = GetTickCount();
 
 for (i=0; i<10000000; i++)
 {
 cnt = 16;
 __asm
 {
 push eax
 push ecx
 push esi
 xor esi, esi
 xor ecx, ecx
 loop2:
 
 movsx eax, a_array[esi] 
 
 add cx, ax
 add esi, 2
 sub cnt, 1
 jnz loop2
 mov res1, ecx
 pop esi
 pop ecx
 pop eax
 }
 }
 Time2 = GetTickCount();
 
 printf("\n Without MMX ...\n");
 printf("\nResult1 = %d", res1);
 printf("\nTime elapsed = %d ms\n", Time2 - Time1);
 Speedup = float((Time2 - Time1))/float(Delay1);
 printf("\nMMX SpeedUp = %10.4f times\n\n", Speedup);
 return 0;
 }
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2011, 09:17
Ответы с готовыми решениями:

Сложить две матрицы с использованием MMX и без. И посчитать время
Задача такая: Умножить матрицу А на число которое введет пользователь. Затем...

[MMX] Сложение чисел матрицы по главной диагонали
Если было то пожалуйста ссылку =) #include &quot;stdafx.h&quot; #include &lt;iostream&gt; ...

нужно найти сумму все чисел делящихся на 3 без остатка
Здравствуйте, помогите решить пожалуйста две задачи условия такие: 1) В...

Вычислить сумму элементов массива (xmm, mmx)
ассемблерные вставки (xmm и mxx команды) само задание: вычислить сумму...

MMX-сложение чисел со знаком
вобщем используя MMX нужно сложить два массива в третий .686 .model...

3
murderer
3321 / 1467 / 134
Регистрация: 06.10.2010
Сообщений: 3,230
14.05.2011, 11:47 2
Так должно работать при условии, что cnt кратно 4.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
push    esi
mov     ecx,[cnt]
lea     esi,[a_array+ecx*2]
neg     ecx
pcmpeqd mm2,mm2
psrlw   mm2,15    ;mm2 = (1,1,1,1)
pxor    mm0,mm0
b:movq    mm1,[esi+ecx*2]
  pmaddwd mm1,mm2
  paddd   mm0,mm1
  add     ecx,4
jnz b
movq    mm1,mm0
psrlq   mm1,32
paddd   mm0,mm1
movd    [res],mm0
emms
pop     esi
0
Кристина33
12 / 12 / 0
Регистрация: 06.06.2010
Сообщений: 50
14.05.2011, 11:55  [ТС] 3
Цитата Сообщение от murderer Посмотреть сообщение
Так должно работать при условии, что cnt кратно 4.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
push    esi
mov     ecx,[cnt]
lea     esi,[a_array+ecx*2]
neg     ecx
pcmpeqd mm2,mm2
psrlw   mm2,15    ;mm2 = (1,1,1,1)
pxor    mm0,mm0
b:movq    mm1,[esi+ecx*2]
  pmaddwd mm1,mm2
  paddd   mm0,mm1
  add     ecx,4
jnz b
movq    mm1,mm0
psrlq   mm1,32
paddd   mm0,mm1
movd    [res],mm0
emms
pop     esi
ошибку выдает в этой строчке! lea esi,[a_array+ecx*2].
скиньте полный текст проги!может я не так пишу!
0
murderer
3321 / 1467 / 134
Регистрация: 06.10.2010
Сообщений: 3,230
14.05.2011, 14:06 4
Объяви cnt как long.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.05.2011, 14:06

Сложить 13 целых чисел только MMX действиями
Уважаемые форумчане, помогите исправить ошибки в коде. Код был написан только...

Сложить два массива по 8 натуральных чисел, с насыщением MMX ассемблер NASM
Здравствуйте! Пишу программу, складывающую поэлементно 2 массива по 8...

Найти пересечение двух множеств чисел, представленных двумя введёнными массивами (нужны комментарии)
*Найти пересечение двух множеств чисел, пердставленных двумя введёнными...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru