- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我已经能够在相同大小的 uint32_t 数组上使用 64 位副本来提高性能,并且想对来自 uint32_t[16] 数组的 16 个 uint32_t 变量序列执行相同的操作。我无法用数组替换变量,因为它会导致性能下降。
我注意到编译器按顺序为一系列已声明的 uint32_t 变量提供指针地址,相反,最后一个变量获得最低地址并增加 4 个字节到第一个声明的变量。我尝试使用该最终变量的起始目标地址并将其转换为 uint64_t * 指针,但这没有用。然而,uint32_t[16] 数组的指针是按顺序排列的。
这是我最近尝试的一个例子。
uint32_t x00,x01,x02,x03,x04,x05,x06,x07,x08,x09,x10,x11,x12,x13,x14,x15;
uint64_t *Bu64ptr = (uint64_t *) B;
uint64_t *x15u64ptr = (uint64_t *) &x15;
/* This is an inline function that does 64-bit eqxor on two uint32_t[16]
& stores the results in uint32_t B[16]*/
salsa8eqxorload64(B,Bx);
/* Trying to 64-bit copy here */
*x15u64ptr++ = *Bu64ptr++;
*x15u64ptr++ = *Bu64ptr++;
*x15u64ptr++ = *Bu64ptr++;
*x15u64ptr++ = *Bu64ptr++;
*x15u64ptr++ = *Bu64ptr++;
*x15u64ptr++ = *Bu64ptr++;
*x15u64ptr++ = *Bu64ptr++;
*x15u64ptr++ = *Bu64ptr++;
我是在追求不可能的事情,还是我的技能不足再次成为阻碍?我检查了x15和x15u64ptr的指针地址值,它们是完全不同的,使用下面的方法。
printf("x15u64ptr %p\n", (void *) x15u64ptr);
printf("x15 %p\n", (void *) &x15);
我有一个想法创建一个数组,并使用 x??变量作为指向数组中各个元素的指针,然后在两个数组上执行 64 位复制,我希望以这种方式将值分配给 uint32_t 变量,但得到了关于 = 赋值无效 ivalue 的编译器失败警告。也许我在语法上做错了什么。使用 64 位 memcpy 替代方案和自定义 64 位 eqxor,我将散列函数的性能提高了 10% 以上,如果我能让它正常工作,我希望这能再提高 5-10%。
*更新 13-09-2018
我结束了使用结构然后基于 NEON 的操作。使用 32 位代码和 memcpy 的原始性能提高 20%。我还能够将技术扩展到 salsa20/8 使用的 add&save 和 eqxor 操作。
struct XX
{
uint32_t x00, x01, x02, x03, x04, x05, x06, x07, x08, x09, x10, x11, x12,x13,x14,x15;
} X;
//dst & src must be uint32_t[32]. Note only 8 operations, to account for "128-bit" though neon really only does 64-bit at a time.
static inline void memcpy128neon(uint32_t * __restrict dst, uint32_t * __restrict src)
{
uint32x4_t *s1 = (uint32x4_t *) dst;
uint32x4_t *s2 = (uint32x4_t *) src;
*s1++ = *s2++;*s1++ = *s2++;*s1++ = *s2++;*s1++ = *s2++;*s1++ = *s2++;*s1++ = *s2++;*s1++ = *s2++;*s1++ = *s2++;
}
然后像这样调用...memcpy128neon(&X.x00,arr);
更新 16-10-2018如果找到这个允许 Union Casting 的宏...
#define UNION_CAST(x, destType) \
(((union {__typeof__(x) a; destType b;})x).b)
下面是一个使用自定义类型创建 1024 位指针的示例,该自定义类型基于 Arm 的 neon uint32x4_t vector ,用于具有 8 个索引的数组,但可以使用任何数据类型。这使得转换符合严格的别名。
uint32x4x8_t *pointer = (uint32x4x8_t *) UNION_CAST(originalpointer, uint32x4x8_t *);
最佳答案
不保证变量会按照声明的顺序放入内存。
我会用 union 双关自己。
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#define SOMETHING (uint64_t *)0x12345676 // only
#define LITTLEENDIAN 1
typedef union
{
uint32_t u32[2];
uint64_t u64;
}data_64;
int main()
{
uint64_t *Bu64ptr = SOMETHING;
data_64 mydata[10];
//you can copy memory
memcpy(mydata, Bu64ptr, sizeof(mydata));
//or just loop
for(size_t index = 0; index < sizeof(mydata) / sizeof(mydata[0]); index++)
{
mydata[index].u64 = *Bu64ptr++;
}
for(size_t index = 0; index < sizeof(mydata) / sizeof(mydata[0]); index++)
{
printf("Lower word = %x, Upper word = %x\n", mydata[!LITTLEENDIAN], mydata[LITTLEENDIAN]);
}
return 0;
}
在相反的方向上它会以完全相同的方式工作
关于c - 从 uint32_t[16] 数组到 uint32_t 变量序列的 64 位副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52212785/
根据在线文档,这些固定宽度整数类型之间存在差异。对于 int*_t,我们将宽度固定为 * 的值。然而对于其他两种类型,描述中使用形容词最快和最小来请求底层数据模型提供的最快或最小实例。 “最快”或“最
我是 Python 注释的新手(类型提示)。我注意到 pyi 中的许多类定义文件继承到 Generic[_T] , 和 _T = TypeVar('_T') . 我很困惑,_T 是什么意思?这里的意思
这个问题在这里已经有了答案: How to use a variable inside a _T wrapper? (3 个答案) 关闭 7 年前。 我有以下代码: CString port = m
要包含 _T() 宏,我应该包含什么文件?它转换我认为的文本文字。我以为它是 windows.h,但我已经包含了它。 令人惊讶的是,我无法在 Google 上找到答案。 最佳答案 我在主题 Unico
类型的后缀 _t 由 POSIX 保留,但是如果我在自己的命名空间中使用 _t 后缀定义自己的类型怎么办? 最佳答案 我同意 user6366161 的 answer,其中说“C 对 namespac
我知道 size_t 有 _t 后缀,因为它的别名/typedef。但是我不明白为什么 char16_t, char32_t 和 wchar_t 包含 _t 后缀。 最佳答案 对于 wchar_t :
我想让这个字符串的主机名部分可变..目前,它只修复了这个 URL: _T(" --url=http://www.myurl.com/ --out=c:\\current.png"); 我想做这样的东西
这个问题在这里已经有了答案: convert string to _T in cpp (6 个答案) 关闭 7 年前。 string pagexx = "http://website.com/" +
我有一个注册为 COM 对象的 .net 库,当在 C++ 项目中导入 .tlb 文件时,我得到这样的方法声明 virtual HRESULT __stdcall GetBid ( /*[
我现在遇到了很多 Unicode 问题。据我了解,TCHAR 被定义为 wchar_t 或 char,具体取决于 _UNICODE 是否在某处定义,并且还有各种其他功能可以帮助解决这个问题。显然 _T
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 9 年前。 Improve t
我正在尝试使用 _t() 方法翻译一个 DataObject。 我一直在 Pages 上使用它没有问题,但它似乎不适用于数据对象。 class SliderItem extends DataObjec
关于保留 _t 结尾名称的规则是否也适用于作用域名称(例如,在 namespace 或类中定义的类型和类型定义),还是仅适用于全局 namespace 中的类型和类型定义?标准 C/C++ 库或 PO
我确定以前有人问过这个问题,但我无法搜索到文本。如果有人可以解释它们,请给我推荐一篇文章,或者给我正确的搜索查询,我将不胜感激。 谢谢。 最佳答案 这只是一种预感,但看看 Wikipedia C++1
我有一个 UNICODE 应用程序,我们使用 _T(x) 定义如下。 #if defined(_UNICODE) #define _T(x) L ##x #else #define _T(x) x #
我一直想知道是否存在任何命名约定,例如何时对类型使用 ALLCAPS 以及何时附加 _t(以及何时不使用任何东西?)。我知道以前 K&R 发布了各种关于如何使用 C 的文档,但我找不到任何相关内容。
这似乎是一个简单的问题,但我无法通过 Stack Overflow 搜索或 Google 找到它。类型后跟 _t 是什么意思?比如 int_t anInt; 我在 C 代码中经常看到它与硬件密切相关—
C++ 有时使用后缀 _type关于类型定义(例如 std::vector::value_type ),有时_t (例如 std::size_t ),或者没有后缀(普通类,还有像 std::strin
字符串中的“T”代表什么。例如 _T("Hello")。我在需要 unicode 支持的项目中看到了这一点。它实际上告诉处理器什么 最佳答案 _T 代表“文本”。当且仅当您使用 Unicode 支持编
我的代码可以根据 C++ 类型识别您需要使用的 GL 类型。我想制作它的 _t 版本(如 std::decay_t 或 std::enable_if_t)但公开 int常量值 template st
我是一名优秀的程序员,十分优秀!