问题标签 [altivec]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
endianness - 无论 PPC 字节序如何处理 Altivec 加载和存储?
我在 Altivec 中有一些 SIMD 代码并行处理 32 位整数值。在某些情况下,我想将整数加载为小端,在其他情况下加载为大端(注意:此选择与本机 CPU 字节序无关;它基于正在运行的算法)。正如Apple所记录的,使用 Altivec 的置换操作非常容易进行实际的字节交换。
我担心的部分是PowerPC允许大端或小端操作,所以我不知道我是否需要在小端加载/存储或大端加载/存储上进行字节交换。(目前我的代码总是为小端执行它,并且从不交换大端内存操作,这在我目前使用的 970 上运行良好,因为它当然运行的是大端)。
据我所知,小端模式下的 PPC 相对较少,但它们确实存在,理想情况下,我希望无论模式如何,我的代码都能正确快速地工作。
有没有一种方法可以处理对 AltiVec 寄存器的大小字节序负载,而不管 CPU 字节序如何?还有其他与此相关的问题我应该知道吗?维基百科有(未引用,自然)声明:
“AltiVec 操作,尽管是 128 位,但被视为 64 位。这允许与在 AltiVec 之前设计的小端主板兼容。”
这让我觉得在 little-endian 模式下可能还有其他特定于 AltiVec 的讨厌。
optimization - 是什么让 Apple 的 PowerPC memcpy 如此之快?
我已经编写了几个复制函数来寻找 PowerPC 上的良好内存策略。将 Altivec 或 fp 寄存器与高速缓存提示 (dcb*) 结合使用,可将大数据的简单字节复制循环的性能提高一倍。最初对此感到满意,我扔了一个普通的 memcpy 来看看它的比较……比我最好的快 10 倍!我无意重写 memcpy,但我确实希望从中学习并加速几个简单的图像过滤器,这些过滤器大部分时间都在将像素移入和移出内存。
Shark 分析表明,它们的内部循环使用 dcbt 进行预取,先读取 4 次向量,然后写入 4 次向量。在将我最好的函数调整为每次迭代也可以传输 64 个字节之后,memcpy 的性能优势仍然令人尴尬。我正在使用 dcbz 来释放带宽,Apple 什么都不使用,但是这两种代码在商店中往往会犹豫不决。
有没有人对为什么非常相似的代码有如此巨大的性能差距有一些想法?我很想在 memcpy 使用的任何秘密酱汁中腌制真实的图像过滤器!
附加信息:所有数据都是矢量对齐的。我正在制作图像的过滤副本,而不是替换原始图像。该代码在 PowerPC G4、G5 和 Cell PPU 上运行。Cell SPU 版本已经非常快了。
c++ - Eclipse CDT 编辑器支持 altivec C++ 扩展?
Eclipse CDT C++ 编辑器是否具有支持 Altivec C++ 语言扩展的方法,例如在使用 -maltivec 编译时在 GNU g++ 编译器中实现的那样?
具体来说,是否可以停止将矢量数据类型报告为语法错误?例如
声明一个名为“foo”的 128 位向量变量,其中包含 16 个 8 位无符号字符。
simd - 将 MMX/SSE 指令移植到 AltiVec
让我以此作为开场白。我在 ASM 方面的经验非常有限,在 SIMD 方面的经验更是少之又少。
但碰巧我有以下 MMX/SSE 优化代码,我想移植到 AltiVec 指令以在 PPC/Cell 处理器上使用。
这可能是一个很大的问题。尽管它只有几行代码,但我在试图弄清楚这里发生的事情时遇到了无穷无尽的麻烦。
原函数:
关于如何重写它以使用 AltiVec 指令的任何提示?
我的第一次尝试(一次非常错误的尝试)看起来像这样。但它并不完全(甚至是远程)正确。
c++ - 浮点值的 AltiVec vec_msum 等效项
有人知道针对浮点值向量实现 vec_msum 功能的方法吗?
我对 SIMD 很陌生,虽然我认为我开始理解它了 - 仍然有一些谜题。
我的最终目标是重写函数“convolve_altivec”(在这个问题的接受答案中找到),以便它接受输入参数作为浮点值,而不是短值。
也就是说,原型应该是
我正在尝试匹配以下原始非优化功能提供的功能:
我最初的努力是尝试将相同功能的现有 SSE 版本移植到 altivec 指令。
c++ - 使用联合将相同的内存分配给类成员变量
我正在尝试矢量化现有的 Vector 类
尝试向量化类成员而不影响访问这些成员变量的其他类
但是由于没有找到成员名称 X,Y,Z 存在编译器错误。是否有另一种获取变量的方法?
作为参考,该vector float
类型来自IBM™ Cell Broadband Engine™ Software Development Kit V3.0 for Multicore Acceleration。
sse - 将分散索引转换为聚集索引的有效方法?
我正在尝试使用 SIMD 内在函数编写流压缩(获取数组并删除空元素)。循环的每次迭代一次处理 8 个元素(SIMD 宽度)。
使用 SSE 内在函数,我可以使用 _mm_shuffle_epi8() 相当有效地做到这一点,它执行 16 个条目的表查找(收集并行计算术语)。随机索引是预先计算的,并使用位掩码进行查找。
我的问题是现在我也想为 Altivec SIMD 实现这个(不要问为什么——错误的商业决策)。Altivec 没有关键成分 _mm_movemask_epi8() 的等效项。所以,我需要找到一种方法
emulate _mm_movemask_epi8() - 看起来很贵,需要几个班次和 OR
直接有效地生成洗牌索引 -
即,索引 i 将是未压缩数据中第 i 个有效元素的索引
串行执行此操作很简单,但我需要它是并行的(SIMD)。生成带有前缀总和的分散索引似乎很容易,但由于 AltiVec 和 SSE 都没有分散指令,所以我需要收集索引。收集索引是分散索引的反函数,但是如何并行得到呢?我知道在 GPU 编程的开创性日子里,将散点图转换为集合是一种常见的技术,但所描述的这两种方法似乎都不实用。
也许如果不坚持压缩保留元素顺序将允许更有效的实施?我可以放弃那个。
simd - 使用 SIMD 指令避免无效的内存加载
我正在使用 SIMD 加载指令从内存中加载元素,假设使用 Altivec,假设地址对齐:
现在如果 SIZE 不是 FLOAT_VEC_SIZE 的倍数,那么 V0 可能在最后一次循环迭代中包含一些无效的内存元素。避免这种情况的一种方法是通过一次迭代减少循环,另一种方法是屏蔽潜在的无效元素,这里还有其他有用的技巧吗?考虑到上述内容是一组嵌套循环的最内层。因此,任何额外的非 SIMD 指令都会带来性能损失!
simd - fftw simd-altivec.h 无法编译
我在使用 Xcode 4.4 的 Mac 上使用 fftw。在我的项目中,我将整个 fftw 源代码添加到项目中并尝试编译它。
它无法成功编译,因为在 simd-altivec.h 中,它给出了如下错误:
ALTIVEC 仅适用于单精度
编译 simd-altivec.h 需要 -maltivec 或等效项
未知类型向量
未知类型 V
我的问题是:
将第三方库添加到我的项目中的更好方法是什么?直接将所有源文件添加到我的项目中对我来说似乎很尴尬......
二、simd-altivec.h中的错误应该如何处理?simd-altivec.h 是做什么的?
sse - x264 库速度 - Altivec 与 SSE4 -
我有简单便宜的双核 intel-3ghz-debian 和超级昂贵的 powerPc7-Aix。
经过几天的奋斗,我编译了libx264并在两台计算机上进行了测试:
- GCC:intel 上的 x264 库(具有 SSE2 功能)和
- 16 核 powerPc 上的 GCC(使用 altivec)。
...结果是便宜的英特尔快了2 倍!(禁用 altivec,英特尔快 10 倍)
我的问题:这正常吗?所有其他 powerPC 用户是否有相同的结果?x264 库的 powerPc-altivec-optimisation 可以与英特尔以相同的速度工作吗?
我对多线程选项不感兴趣。核心数和线程数无关紧要。只是简单的单线程 x264 编码,默认“中等预设”,使用 rawvideo 作为源,sse vs altivec。
也许原生 Aix XLC 编译器会提供更好的结果?(我只管理 gcc 工作)
... mac-powerpc-users 可能对此有所了解。