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

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

13.05.2011, 09:17. Просмотров 620. Ответов 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 и без (Assembler):

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

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

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

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

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

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

3
murderer
3314 / 1461 / 133
Регистрация: 06.10.2010
Сообщений: 3,215
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
3314 / 1461 / 133
Регистрация: 06.10.2010
Сообщений: 3,215
14.05.2011, 14:06 #4
Объяви cnt как long.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.05.2011, 14:06
Привет! Вот еще темы с решениями:

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

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

найти сумму элементов лежащих на [1,2], решить двумя способами:просто и с использованием массивов.
Здравствуйте! Помогите пожалуйста решить хотя бы одну из этих задач. 1)найти...

Найти натуральное число представимое двумя разными способами суммой кубов двух чисел
Найти натуральное число n, которое подается двумя разными способами суммой...


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

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

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