Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SIMD SSE内部指令到等效c代码的转换_C_Sse - Fatal编程技术网

SIMD SSE内部指令到等效c代码的转换

SIMD SSE内部指令到等效c代码的转换,c,sse,C,Sse,我得到了一个将SIMD SSE指令转换为等效C代码的任务。。。代码是这样的 (I1_block_addr——是一个uint8_t,esc_offset_1是一个32位整数。) 我所做的是 char *c1; char xmm1[16],xmm6[16]; short xmm6s[16] //for loding 16 byte c1=( char* )( I1_block_addr + desc_offset_1 ); memcpy( xmm1 , c1 , 16 );

我得到了一个将SIMD SSE指令转换为等效C代码的任务。。。代码是这样的 (I1_block_addr——是一个uint8_t,esc_offset_1是一个32位整数。)

我所做的是

 char *c1;
 char xmm1[16],xmm6[16];
 short xmm6s[16]

 //for loding 16 byte 
  c1=( char* )( I1_block_addr + desc_offset_1 );
  memcpy( xmm1 , c1 , 16 ); 

  c1=( char* )( I2_block_addr + desc_offset_1 );
  memcpy( xmm6 , c1 , 16 ); 

 xmm6s[0] = (short) ( abs(xmm1[0]-xmm6[0]) + abs(xmm1[1]-xmm6[1]) + abs(xmm1[2]-xmm6[2]) + abs(xmm1[3]-xmm6[3]) + abs(xmm1[4]-xmm6[4]) + abs(xmm1[5]-xmm6[5]) + 
            abs(xmm1[6]-xmm6[6]) + abs(xmm1[7]-xmm6[7]) );

xmm6s[1] = 0;   xmm6s[2] = 0;   xmm6s[3] = 0;   

xmm6s[4] = (short) ( abs(xmm1[8]-xmm6[8]) + abs(xmm1[9]-xmm6[9]) +    abs(xmm1[10]-xmm6[10]) + abs(xmm1[11]-xmm6[11]) + abs(xmm1[12]-xmm6[12]) + 
abs(xmm1[13]-xmm6[13]) + abs(xmm1[14]-xmm6[14]) + abs(xmm1[15]-xmm6[15]) );

xmm6s[5] = 0;   xmm6s[6] = 0;   xmm6s[7] = 0;

我没有得到任何错误,但图像质量正在下降。请告诉我代码的哪一部分是错误的,以及如何更正它。

代码看起来大致正常-我认为您只需要将char/short类型更改为适当的未签名类型:

#include <stdint.h>

uint8_t *c1;
uint8_t xmm1[16], xmm6[16];
uint16_t xmm6s[8];

c1 = I1_block_addr + desc_offset_1;
memcpy(xmm1, c1, 16); 

c1 = I2_block_addr + desc_offset_1;
memcpy(xmm6, c1, 16); 

xmm6s[0] = (uint16_t) ( abs(xmm1[0]-xmm6[0]) + abs(xmm1[1]-xmm6[1]) + abs(xmm1[2]-xmm6[2]) + abs(xmm1[3]-xmm6[3]) + 
                        abs(xmm1[4]-xmm6[4]) + abs(xmm1[5]-xmm6[5]) + abs(xmm1[6]-xmm6[6]) + abs(xmm1[7]-xmm6[7]) );

xmm6s[1] = xmm6s[2] = xmm6s[3] = 0;   

xmm6s[4] = (uint16_t) ( abs(xmm1[8]-xmm6[8]) + abs(xmm1[9]-xmm6[9]) + abs(xmm1[10]-xmm6[10]) + abs(xmm1[11]-xmm6[11]) + 
                        abs(xmm1[12]-xmm6[12]) + abs(xmm1[13]-xmm6[13]) + abs(xmm1[14]-xmm6[14]) + abs(xmm1[15]-xmm6[15]) );

xmm6s[5] = xmm6s[6] = xmm6s[7] = 0;
#包括
uint8_t*c1;
uint8_t xmm1[16],xmm6[16];
uint16_t xmm6s[8];
c1=I1块地址+描述偏移量1;
memcpy(xmm1,c1,16);
c1=I2块地址+描述偏移量1;
memcpy(xmm6,c1,16);
xmm6s[0]=(uint16_t)(abs(xmm1[0]-xmm6[0])+abs(xmm1[1]-xmm6[1])+abs(xmm1[2]-xmm6[2])+abs(xmm1[3]-xmm6[3])+
abs(xmm1[4]-xmm6[4])+abs(xmm1[5]-xmm6[5])+abs(xmm1[6]-xmm6[6])+abs(xmm1[7]-xmm6[7]);
xmm6s[1]=xmm6s[2]=xmm6s[3]=0;
xmm6s[4]=(uint16_t)(abs(xmm1[8]-xmm6[8])+abs(xmm1[9]-xmm6[9])+abs(xmm1[10]-xmm6[10])+abs(xmm1[11]-xmm6[11])+
abs(xmm1[12]-xmm6[12])+abs(xmm1[13]-xmm6[13])+abs(xmm1[14]-xmm6[14])+abs(xmm1[15]-xmm6[15]);
xmm6s[5]=xmm6s[6]=xmm6s[7]=0;

代码看起来大致正常-我认为您只需要将char/short类型更改为适当的未签名类型:

#include <stdint.h>

uint8_t *c1;
uint8_t xmm1[16], xmm6[16];
uint16_t xmm6s[8];

c1 = I1_block_addr + desc_offset_1;
memcpy(xmm1, c1, 16); 

c1 = I2_block_addr + desc_offset_1;
memcpy(xmm6, c1, 16); 

xmm6s[0] = (uint16_t) ( abs(xmm1[0]-xmm6[0]) + abs(xmm1[1]-xmm6[1]) + abs(xmm1[2]-xmm6[2]) + abs(xmm1[3]-xmm6[3]) + 
                        abs(xmm1[4]-xmm6[4]) + abs(xmm1[5]-xmm6[5]) + abs(xmm1[6]-xmm6[6]) + abs(xmm1[7]-xmm6[7]) );

xmm6s[1] = xmm6s[2] = xmm6s[3] = 0;   

xmm6s[4] = (uint16_t) ( abs(xmm1[8]-xmm6[8]) + abs(xmm1[9]-xmm6[9]) + abs(xmm1[10]-xmm6[10]) + abs(xmm1[11]-xmm6[11]) + 
                        abs(xmm1[12]-xmm6[12]) + abs(xmm1[13]-xmm6[13]) + abs(xmm1[14]-xmm6[14]) + abs(xmm1[15]-xmm6[15]) );

xmm6s[5] = xmm6s[6] = xmm6s[7] = 0;
#包括
uint8_t*c1;
uint8_t xmm1[16],xmm6[16];
uint16_t xmm6s[8];
c1=I1块地址+描述偏移量1;
memcpy(xmm1,c1,16);
c1=I2块地址+描述偏移量1;
memcpy(xmm6,c1,16);
xmm6s[0]=(uint16_t)(abs(xmm1[0]-xmm6[0])+abs(xmm1[1]-xmm6[1])+abs(xmm1[2]-xmm6[2])+abs(xmm1[3]-xmm6[3])+
abs(xmm1[4]-xmm6[4])+abs(xmm1[5]-xmm6[5])+abs(xmm1[6]-xmm6[6])+abs(xmm1[7]-xmm6[7]);
xmm6s[1]=xmm6s[2]=xmm6s[3]=0;
xmm6s[4]=(uint16_t)(abs(xmm1[8]-xmm6[8])+abs(xmm1[9]-xmm6[9])+abs(xmm1[10]-xmm6[10])+abs(xmm1[11]-xmm6[11])+
abs(xmm1[12]-xmm6[12])+abs(xmm1[13]-xmm6[13])+abs(xmm1[14]-xmm6[14])+abs(xmm1[15]-xmm6[15]);
xmm6s[5]=xmm6s[6]=xmm6s[7]=0;

从您的问题来看,您似乎正在处理无符号8位数据,但您在减法之前隐式转换为有符号值,这将在原始输入值大于127时给出不正确的值,因此得到错误的符号扩展。从您的问题来看,您似乎正在处理无符号8位数据,但是您在减法之前隐式地强制转换到有符号值,当原始输入值大于127时,会给出错误的值,因此会得到错误的符号扩展。