powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как сложить 2 вектора поэлементно...
4 сообщений из 4, страница 1 из 1
Как сложить 2 вектора поэлементно...
    #34499443
chpocks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите пожалуйста, а то я уже голову сломал...
Пишу на VisualC++. В общем надо сложить 2 вектора поэлементно и записать результат в 3-ий вектор. Все бы хорошо, да только это нужно сделать с использованием SSE инструкций.

float *x, *y, *z;
x = new float [8];
y = new float [8];
z = new float [8];
x[0] = 1; x[1] = 2; x[2] = 3; x[3] = 4; x[4] = 5; x[5] = 6; x[6] = 7; x[7] = 8;
y[0] = 10; y[1] = 20; y[2] = 30; y[3] = 40; y[4] = 50; y[5] = 60; y[6] = 70; y[7] = 80;
z[0] = 0; z[1] = 0; z[2] = 0; z[3] = 0; z[4] = 0; z[5] = 0; z[6] = 0; z[7] = 0;

for (int i=0;i<8;i++) printf("%f ",z );
printf("\n");
__asm
{
push eax;

mov eax, x;
movups xmm1, [eax];

mov eax, y;
movups xmm2, [eax];

addps xmm1, xmm2;

movups eax, xmm1;
mov z, eax;

pop eax;
}

for (int i=0;i<8;i++)
printf("%f ",z);
printf("\n");

delete z;
delete y;
delete x;

В итоге выводится 2 строки:
0 0 0 0 0 0 0 0
10 20 30 40 50 60 70 80

А должно выводиться
0 0 0 0 0 0 0 0
11 22 33 44 55 66 77 88

Это первая проблема и вторая программа вываливается на команде delete.

Пожалуйста подскажите, что я делаю не правильно...
...
Рейтинг: 0 / 0
Как сложить 2 вектора поэлементно...
    #34499633
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Как-то странно вы выводите на экран вектор z. Нет-ли там ошибки?

2) В С++ рекомендуется удалять массивы так "delete[] z"
...
Рейтинг: 0 / 0
Как сложить 2 вектора поэлементно...
    #34500328
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpocks
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
		mov eax, y;
		movups xmm2, [eax];

		addps xmm1, xmm2;

		movups eax, xmm1;
		mov z, eax;

Первая строка: копируем в eax адрес y, последняя строка копируем в z адрес из eax. То есть, теперь z показывает на y, а бывший z пропал совсем. Поэтому и программа на delete падает - дважды пытаешься освободить y.

Замени последние две строчки в этом куске на
Код: plaintext
1.
		mov eax, z;
		movups eax, xmm1;
А потом подумай, а сколько элементов movups и addps обрабатывают?
...
Рейтинг: 0 / 0
Как сложить 2 вектора поэлементно...
    #34500412
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой, опечатался, скобочки забыл...
Код: plaintext
1.
		mov eax, z;
		movups [eax], xmm1;
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как сложить 2 вектора поэлементно...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]