- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
嗨,
关于我之前的帖子,我解决了 SSE 中的比较操作。
但是在获得输出后,我观察到我的输出是浮点形式,而我的预期输出是 uchar 。
例如,我期望输出为 8,输出以 floatng 格式为 8.0(32 位浮点格式)。将该值转换为 1 字节无符号值后,这与 8 有很大不同。
PFB 我在 C 中的原始代码及其在 SSE 中的相应代码:
C 代码:
unsigned char *destination_buff = (unsigned char *)malloc(sizeof(unsigned char)*height*width);
float *d1 = inputbuffer;
float *d2 = d1 + width;
float *d3 = d2 + width;
for(int i=1;i<height;i++)
{
for(int j=1;j<width;j++)
{
int val = d2[j];
int temp1 = 0x00FF;
int temp2 = 0;
if(val <= d1[j-1]) temp2 += 0x80;
if(val <= d1[j]) temp2 += 0x40;
if(val <= d1[j+1]) temp2 += 0x20; }
if(val <= d2[j-1]) temp2 += 0x10;}
if(val <= d2[j+1]) temp2 += 0x08;
if(val <= d3[j-1]) temp2 += 0x04;
if(val <= d3[j]) temp2 += 0x02;
if(val <= d3[j+1]) temp2 ++;
temp1 &= (~temp2);
destination_buff[j-1] = temp1;
}
d1 += width;
d2 += width;
d3 += width;
destination_buff += (width);
}
这是我的 SSE 代码:
float *destination_buff = (float *)malloc(sizeof(float)*height*width);
uchar *dst_d = outputbuffer; //Pointer to the destination buffer which is already present and need to fill the output data in this
float *CT_image_0 = m_dat;
float *CT_image_1 = CT_image_0 + width;
float *CT_image_2 = CT_image_1 + width;
for(int i=1;i<height;++i)
{
for(int j=1;j<width;j+=4)
{
__m128 CT_current_00 = _mm_loadu_ps((CT_image_0+j-1));
__m128 CT_current_10 = _mm_loadu_ps((CT_image_1+j-1));
__m128 CT_current_20 = _mm_loadu_ps((CT_image_2+j-1));
__m128 CT_current_01 = _mm_loadu_ps(((CT_image_0+1)+j-1));
__m128 CT_current_11 = _mm_loadu_ps(((CT_image_1+1)+j-1));
__m128 CT_current_21 = _mm_loadu_ps(((CT_image_2+1)+j-1));
__m128 CT_current_02 = _mm_loadu_ps(((CT_image_0+2)+j-1));
__m128 CT_current_12 = _mm_loadu_ps(((CT_image_1+2)+j-1));
__m128 CT_current_22 = _mm_loadu_ps(((CT_image_2+2)+j-1));
__m128 val = CT_current_11;
__m128 t1 = _mm_set1_ps(0x80);
__m128 t2 = _mm_set1_ps(0x40);
__m128 t3 = _mm_set1_ps(0x20);
__m128 t4 = _mm_set1_ps(0x10);
__m128 t5 = _mm_set1_ps(0x08);
__m128 t6 = _mm_set1_ps(0x04);
__m128 t7 = _mm_set1_ps(0x02);
__m128 t8 = _mm_set1_ps(0x01);
__m128 out = _mm_setzero_ps(); // init output flags to all zeroes
__m128 sample = _mm_cmple_ps(val,CT_current_00);
sample = _mm_and_ps(sample,t1);
out = _mm_or_ps(out,sample);
sample = _mm_cmple_ps(val,CT_current_01);
sample = _mm_and_ps(sample,t2);
out = _mm_or_ps(out,sample);
sample = _mm_cmple_ps(val,CT_current_02);
sample = _mm_and_ps(sample,t3);
out = _mm_or_ps(out,sample);
sample = _mm_cmple_ps(val,CT_current_10);
sample = _mm_and_ps(sample,t4);
out = _mm_or_ps(out,sample);
sample = _mm_cmple_ps(val,CT_current_12);
sample = _mm_and_ps(sample,t5);
out = _mm_or_ps(out,sample);
sample = _mm_cmple_ps(val,CT_current_20);
sample = _mm_and_ps(sample,t6);
out = _mm_or_ps(out,sample);
sample = _mm_cmple_ps(val,CT_current_21);
sample = _mm_and_ps(sample,t7);
out = _mm_or_ps(out,sample);
sample = _mm_cmple_ps(val,CT_current_22);
sample = _mm_and_ps(sample,t8);
out = _mm_or_ps(out,sample);
_mm_storeu_ps((destination_buff+(j-1)),out);
dst_d = (uchar *)destination_buff;
}
CT_image_0 += width;
CT_image_1 += width;
CT_image_2 += width;
dst_d += (width);
}
所有存储操作都在 float 和 __m128i 上。如何将结果存储到 uchar 中?
最佳答案
您可以进行压缩比较来获取掩码,然后将该掩码与整数操作一起使用。 _mm_set1_ps(0x80)
表示您正在做一些奇怪的事情。您可能不应该将 2 的幂位掩码转换为浮点,因为用 _mm_add_ps
添加它们比用 _mm_or_si128
组合它们要慢得多。
对于某些偏移负载,您可能还最好使用 palignr
来平衡负载端口和 ALU 端口之间的代码。
关于c - SSE 中浮点到 uchar 的转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26406449/
我有一些图像数据作为 uchar* .我需要将其作为 std::vector 运行处理,然后将其转换回来。我正在使用这段代码: unsigned char* buffer = inputImg.dat
我有一个浮点矩阵 a,我想访问点 (x,y) 处的元素,但我想将数据类型转换为 unsigned char。 point(x,y)中的 float 为652.759 我要使用的代码(基于Opencv)
我们在这里讨论了使用(或不使用)unsafe.Pointer 将指向字节数组的指针从 Go 传递到 C。 (不)使用 unsafe.Pointer() 的最大原因是什么?我会把一致性作为一个原因,因为
我正在尝试使用指针遍历 cv::Mat。所以我在我的函数中做了以下操作: template inline cv::Mat_ dct(const cv::Mat_& oBlock) { cv::
当我在 64 位机器上运行以下代码时(编译器 clang) typedef unsigned char byte; void foo ( byte* a ) { std::cout int
我正在尝试对两个字符串进行 uchar 比较和复制,基本上是 strcpy 和 strcmp,但这似乎永远不起作用。 typedef unsigned char uchar; uchar a[20]
我正在尝试设置一个 uchar 如下: uchar num = 0; //0 num <<= 1; //1 num |=1; num <<=1; //0
代码: unsigned char data[20][20] = {{50, 50....}, .... ....}; Mat speed(20, 20, data); 当我尝试访问 sp
我的 ODBC 日志中有以下行: (场景:pgAdmin4,在另一个名为 System Administration 的应用程序中通过 ODBC32 使用 PostgreSQL 服务器) System
我想知道如何在 C++/MFC 中将 UCHAR 数组转换为二进制字符串。 我用 Cstring 尝试了一些可能性,但它们没有用。请告诉我原因。 这是我试过的代码: UCHAR ucdata[256]
我有一个无符号字符数组,其值如下: u_char *t_header[4]; //filled with values 0x00000047,0x00000004,0x00000093,0x00000
在 C 中,在 Unix 环境(Plan9)中,我有一个数组作为内存。 uchar mem[32*1024]; 我需要该数组包含不同的字段,例如 int(整数)以指示可用内存的大小。所以,我试过这个:
这是将十六进制字符串转换为字节数组的代码,它工作正常但是当循环结束并且编译器到达函数末尾时它会抛出此错误:“变量‘uChar’周围的堆栈已损坏” void Cfsp::stringToHex(unsi
我有一个 JNI 函数,它返回一个 UChar 数组(来自 ICU4C 库),我想将其转换为 Java 字符数组,以便我可以从 Java 调用它。我不确定问题出在哪里,因为每当我访问这个 JNI 函数
嗨, 关于我之前的帖子,我解决了 SSE 中的比较操作。 但是在获得输出后,我观察到我的输出是浮点形式,而我的预期输出是 uchar 。 例如,我期望输出为 8,输出以 floatng 格式为 8.0
我正在编写一个将文本传递给库函数的程序。此函数期望文本参数的类型为unsigned char*。 那么我怎样才能正确地将字符串传递给该函数呢?我无法将现有的 char* 转换为 unsigned ch
如何将 uchar 转换为 int? 最佳答案 如果 uchar 是 unsigned char 的类型定义,那么很简单: unsigned char c = 'A'; int i = c; //au
问题很简单:sizeof((u_char)value) 返回 8。strlen 失败。如何获取uchar内容的长度? 尝试过 std::cout << "Data: " << (u_char *)da
我有一个需要发送的 uchar 缓冲区。无法转换为 char。 我有一个示例项目: send(SOCKET s, void *buf, size_t length) { return send(s,
我第一次使用 WinAPI,我有一个返回 UCHAR* 的函数,但我需要它作为 std:string,因为当我尝试将它打印为 UCHAR* 但当我这样做时它会打印出很多乱码。必须有一些简单的方法来解决
我是一名优秀的程序员,十分优秀!