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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.09.2013, 22:09   #1
Bummmm
Новичок
Джуниор
 
Аватар для Bummmm
 
Регистрация: 03.09.2013
Сообщений: 5
По умолчанию SSE. Подение программы

Привет ребята!
Такое дело, есть задание:

Обработать массивы из 8 элементов по следующему выражению:

F[i]=A[i]-B[i]*C[i]-D[i] , i=1...8;

Используются следующие массивы:
A, B и С – 8 разрядные целые знаковые числа (_int8);
D – 16 разрядные целые знаковые числа (_int16).
Полученный результат отобразить на форме с использованием соответствующих элементов. При распаковке знаковых чисел совместно с командами распаковки использовать команды сравнения (сравнивать с нулём перед распаковкой).

Всё бы ничего, но как только я пытаюсь сделать вычисления, программа падает (в 1 из 5 случаем, обрабатывает 3 элемента и зависает):
https://www.dropbox.com/s/0spd9ctqqe57d2g/SSEDeb.png

Я не могу понять, в чем дело (компилирую в Visula Studio 2010):
Код (с участком показанным на скриншоте):

Код:
#include "stdafx.h"
#include "SSE.h"
#include <iostream>
#include <malloc.h>
using namespace std;

double* SSESolve(float* a, float* b, float* c, double* d)
{
	double* resultPointer = (double*)malloc(8 * sizeof(double));
	float arr_a[8];
	float arr_b[8];
	float arr_c[8];
	double arr_d[8];
	float preresult[8];	
	double result[8];
	memcpy((void*)(&arr_a), (void*)a, 8*sizeof(float));	
	memcpy((void*)(&arr_b), (void*)b, 8*sizeof(float));
	memcpy((void*)(&arr_c), (void*)c, 8*sizeof(float));
	memcpy((void*)(&arr_d), (void*)d, 8*sizeof(double));
	memset((void*)resultPointer, 0, 8*sizeof(double));
	__asm
	{
		/*  F[i]=A[i] - B[i] * C[i] + D[i] , i=1...8; */

		/*
		Команды для чисел с плавающей точкой
Команды пересылки
Скалярные типы – MOVSS
Упакованные типы – MOVAPS, MOVUPS, MOVLPS, MOVHPS, MOVLHPS, MOVHLPS
Арифметические команды
Скалярные типы – ADDSS, SUBSS, MULSS, DIVSS, RCPSS, SQRTSS, MAXSS, MINSS, RSQRTSS
Упакованные типы – ADDPS, SUBPS, MULPS, DIVPS, RCPPS, SQRTPS, MAXPS, MINPS, RSQRTPS
Команды сравнения
Скалярные типы – CMPSS, COMISS, UCOMISS
Упакованные типы – CMPPS
Перемешивание и распаковка
Упакованные типы – SHUFPS, UNPCKHPS, UNPCKLPS
Команды для преобразования типов
Скалярные типы – CVTSI2SS, CVTSS2SI, CVTTSS2SI
Упакованные типы – CVTPI2PS, CVTPS2PI, CVTTPS2PI
Битовые логические операции
Упакованные типы – ANDPS, ORPS, XORPS, ANDNPS
Команды для целых чисел
Арифметические команды
PMULHUW, PSADBW, PAVGB, PAVGW, PMAXUB, PMINUB, PMAXSW, PMINSW
Команды пересылки - PEXTRW, PINSRW
Другие - PMOVMSKB, PSHUFW
Другие команды
Работа с регистром - MXCSR, LDMXCSR, STMXCSR
Управление кэшем и памятью
MOVNTQ, MOVNTPS, MASKMOVQ, PREFETCH0, PREFETCH1, PREFETCH2, PREFETCHNTA, SFENCE
*/
		movups xmm0, arr_b;
		movups xmm1, arr_c;
		mulps xmm0, xmm4;
		movups preresult, xmm0;
		movups xmm0, arr_b+16;
		movups xmm1, arr_c+16;
		mulps xmm0, xmm1;
		movups preresult+16, xmm0;
			
		movups xmm0, arr_a;
		movups xmm1, preresult;
		subps xmm0, xmm1;
		movups preresult, xmm0;
		movups xmm0, arr_a+16;
		movups xmm1, preresult+16;
		subps xmm0, xmm1;
		movups preresult+16, xmm0;
		
		movups xmm0, preresult;
		movaps xmm1, xmm0;
		shufpd xmm1, xmm1, 1; /*<-------------------------Вот здесь */
		cvtps2pd xmm0, xmm0;
		cvtps2pd xmm1, xmm1;
		movups xmm2, preresult+16
		movaps xmm3, xmm2;
		shufpd xmm3, xmm3, 1;
		cvtps2pd xmm2, xmm2
		cvtps2pd xmm3, xmm3;
		
		movups xmm4, arr_d;		
		movups xmm5, arr_d+16;	
		movups xmm6, arr_d+32;	
		movups xmm7, arr_d+48;	
			
		subpd xmm0, xmm4;
		subpd xmm1, xmm5;
		subpd xmm2, xmm6;
		subpd xmm3, xmm7;

		movups result, xmm0;
		movups result+16, xmm1;
		movups result+32, xmm2;
		movups result+48, xmm3;
			
	  
	}
	memcpy((void*)resultPointer, (void*)(&result), 8 * sizeof(double));
	return resultPointer;
}
SSE.h
Код:
double* SSESolve(float* a, float* b, float* c, double* d);
Весь проект полностью (55.9 MB):
https://www.dropbox.com/sh/0b1f14yjyiebw1m/Am7KMEglj-

Ребята, помогите разобраться O_o
Bummmm вне форума Ответить с цитированием
Старый 03.09.2013, 23:53   #2
Bummmm
Новичок
Джуниор
 
Аватар для Bummmm
 
Регистрация: 03.09.2013
Сообщений: 5
По умолчанию

Проблему решил.
Заменил
Код:
 movaps xmm1, xmm0;
 shufpd xmm1, xmm1, 1;
на
Код:
PSHUFD xmm1, xmm0, 00001110b
Bummmm вне форума Ответить с цитированием
Старый 03.09.2013, 23:55   #3
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

странно, конечно. что это за проц, который не дружит с SSE2?

Какой на твоей машине процессор стоит?
f.hump вне форума Ответить с цитированием
Старый 04.09.2013, 00:13   #4
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Цитата:
Заменил
Код:

movaps xmm1, xmm0;
shufpd xmm1, xmm1, 1;

на
Код:

PSHUFD xmm1, xmm0, 00001110b


это, что одно и тоже???

если уж делать такую странную замену, то делать так

movaps xmm1, xmm0;
PSHUFD xmm1, xmm0, 04Eh;
f.hump вне форума Ответить с цитированием
Старый 04.09.2013, 14:05   #5
Bummmm
Новичок
Джуниор
 
Аватар для Bummmm
 
Регистрация: 03.09.2013
Сообщений: 5
По умолчанию

Цитата:
Сообщение от f.hump Посмотреть сообщение
странно, конечно. что это за проц, который не дружит с SSE2?

Какой на твоей машине процессор стоит?
Машина старая, AMD Athlon XP 2200+
Bummmm вне форума Ответить с цитированием
Старый 04.09.2013, 15:09   #6
asmprog
Пользователь
 
Регистрация: 10.08.2013
Сообщений: 67
По умолчанию

не лишним будет проверку воткнуть перед использованием на наличие поддержки SSE/SSE2:
Код:
mov eax,01
cpuid
test edx,03000000h
jz _SSE_AND_SSE2_NOT_SUPPORTED
asmprog вне форума Ответить с цитированием
Старый 04.09.2013, 15:32   #7
Bummmm
Новичок
Джуниор
 
Аватар для Bummmm
 
Регистрация: 03.09.2013
Сообщений: 5
По умолчанию

Цитата:
Сообщение от asmprog Посмотреть сообщение
не лишним будет проверку воткнуть перед использованием на наличие поддержки SSE/SSE2:
Код:
mov eax,01
cpuid
test edx,03000000h
jz _SSE_AND_SSE2_NOT_SUPPORTED
О, вот за это огромное спасибо!
Bummmm вне форума Ответить с цитированием
Старый 04.09.2013, 15:33   #8
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

а, старый AMD, ясна.

кстати, посмотрев на код еще раз возникает вопрос зачем использовать SHUFPD вместо MOVHLPS?

вместо этого

movaps xmm1, xmm0;
shufpd xmm1, xmm1, 1;

поставь вот это

MOVHLPS xmm1, xmm0
f.hump вне форума Ответить с цитированием
Старый 04.09.2013, 17:12   #9
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

прочитал условие задачи
Код:
void SSESolve(int * result, const char * a, const char * b, const char * c, const short * d) {
	__asm {
		
		MOV edx, [b]
		MOV ecx, [c]
				
		PMOVSXBW xmm0, QWORD PTR [edx]
		PMOVSXBW xmm1, QWORD PTR [ecx]

		PMULLLW xmm0, xmm1
		
		MOV eax, [a]
		PMOVSXBD xmm2, DWORD PTR [eax]
		PMOVSXBD xmm3, DWORD PTR [eax+4]

		MOV eax, [d]

		PMOVSXWD xmm4, QWORD PTR [eax]
		PMOVSXWD xmm5, QWORD PTR [eax+8]

		PSUBD xmm2, xmm4
		PSUBD xmm3, xmm5


		PMOVSXWD xmm4, xmm0
		PSRLDQ xmm0, 8
		PMOVSXWD xmm5, xmm0
		
		PSUBD xmm2, xmm4
		PSUBD xmm3, xmm5

		MOV edx, [result]

		MOVDQU [edx], xmm2
		MOVDQU [edx+16], xmm3
	}
}
нужен SSE4.1

Последний раз редактировалось f.hump; 04.09.2013 в 17:20.
f.hump вне форума Ответить с цитированием
Старый 04.09.2013, 18:58   #10
Bummmm
Новичок
Джуниор
 
Аватар для Bummmm
 
Регистрация: 03.09.2013
Сообщений: 5
По умолчанию

Цитата:
Сообщение от f.hump Посмотреть сообщение
а, старый AMD, ясна.

кстати, посмотрев на код еще раз возникает вопрос зачем использовать SHUFPD вместо MOVHLPS?

вместо этого

movaps xmm1, xmm0;
shufpd xmm1, xmm1, 1;

поставь вот это

MOVHLPS xmm1, xmm0
Понял, просто я ещё со всеми командами не разобрался
Bummmm вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Арифметика FASM (SSE) neomax38 Помощь студентам 0 12.06.2013 08:09
SSE инструкции + ликбез Kukurudza Общие вопросы C/C++ 4 10.04.2012 19:26
оптимизация SSE ANsy Мультимедиа в Delphi 1 01.02.2011 20:08
статья - Введение в SSE Pblog Обсуждение статей 0 23.06.2010 05:13
SSE intrinsics C++ qpharm Общие вопросы C/C++ 1 13.11.2009 12:57