问题标签 [vmat]
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.
performance - 对于今天的 vDSP 性能,使用 1 的步幅是否仍然至关重要?
在2006 年 11 月关于使用vDSP对代码进行矢量化的一篇有用但有些过时的文章中,作者发表了以下声明:
需要记住的重要一点是,只有步幅等于 1 的操作才能交付极快的矢量化代码。
今天仍然如此吗?即使在具有更强大矢量内在函数的更新的英特尔处理器上?
我之所以问是因为我正在编写一些矩阵数学例程,并且刚刚开始将它们全部切换为使用类似于 Fortran的列优先排序,以便更容易地与MATLAB、BLAS和LAPACK兼容。但现在我发现我对vDSP的一些调用需要处理不再连续的向量……</p>
目前,这些vDSP调用是我的代码执行的瓶颈例程。并不是说这将永远如此,但至少现在我不想放慢它们的速度,只是为了让对其他库的调用更简单。
我现在最常调用的vDSPvDSP_distancesq
例程是为了以防万一。
templates - 为什么这个函子的 operator() 需要尾随 const 修饰符?
经过多年的缺席,我将回到 C++(或者从技术上讲,Objective-C++),所以请多多包涵。我正在尝试使用模板来实现一个解决方案,否则它需要大量的剪切和粘贴代码。下面的摘录显示了这项工作的基本要点:
我希望从以“为什么?”结尾的评论中可以看出我的问题是,为什么const
这里需要声明?如果省略,编译器会抱怨SwapA(...)
在loadFromOperation
.
SwapA
如果明确声明为,我会理解这一点const
,但事实并非如此。显然它可能是,因为它的操作不依赖于改变任何状态,但这不是重点。
虽然我对这段代码有另一双有用的眼睛,但我欢迎更精通 C++ 实践者可能愿意提供的任何风格或其他评论……</p>
c++ - 如何使 C++ 函数将整数列表隐式转换为向量参数?
我正在开发一个库,其函数通常采用向量类型(__v4si
或 4 个带符号整数的向量)作为参数。(请注意,到目前为止,这与C++ STL 模板类无关vector
;这是一个更原始的构造,用于让编译器生成矢量化SIMD 代码。)
在我的C代码中,我通常调用一个包装宏,它接受一个 int 参数列表并__v4si
像这样初始化:
这当然在C++中也可以正常工作,但我想利用C++更具表现力的类型系统来清理对我的库 API 的调用。例如,我现在写如下内容:
其中宏扩展为:
相反,我希望能够写一些类似的东西:
所以,本质上(我认为)我想定义一个类,它只是原始__v4si
类型周围的语法糖,但它有一个用于列表初始值设定项的隐式强制转换运算符。
我如何在C++ 11中做到这一点?
解决方案
这是一个适用于C和C++代码的公式(现在使用从我的库头文件复制和粘贴的更详细的名称):
在C代码中,您仍然可以像这样使用辅助宏:
但是现在在C++中你可以写:
感谢 nosid 提供了重要的答案!
memory-management - 为什么使用 STL std::vector 作为 __block 变量会导致内存损坏?
经过一段时间和努力,我在我的代码中找到了这个函数的内存破坏错误。__block vector<int>
我通过将两个变量替换为堆栈分配数组的组合来提供存储空间和一个{klist|dlist}Ptr
变量以允许块内的代码访问数组,从而停止了内存破坏(见下面的推荐代码)。这让我相当有信心,它的使用确实__block vector<int>
是有问题的。
[我应该指出,这是一个纯粹的迭代算法;没有递归。该块的存在只是为了避免重复处理左右子树所需的代码。]
The obvious question is, why are the STL vector
objects causing memory corruption here? They are not even doing any dynamic resizing… Is it simply not supported to use a C++ object as a __block
variable?
c++ - 是否可以在 Mountain Lion 上的当前 Xcode 4.6.1 工具链中启用 _LIBCPP_DEBUG2?
该线程是对 clang 的 libc++ 调试模式的早期讨论,该调试模式将通过_LIBCPP_DEBUG2
在编译器命令中定义来启用。刚刚与错误分配进行了斗争,std::vector<>
我有兴趣能够为我的调试版本打开它。
当我尝试简单地添加_LIBCPP_DEBUG=1
到预处理器宏构建设置时,我在链接阶段遇到错误(如下所示)。我怀疑这些是由新生成的对讨论线程中描述的调试数据库的引用引起的。
在早期的讨论中,有人说标准版本的库中提供了必要的支持,但今天似乎并非如此。它仍然支持吗?如果是这样,我如何链接到必要的位?
c++ - 我该如何表达“=<=“使用特征 3?
我正在使用Eigen 3模板库将一些MATLAB代码移植到C++,并且我正在为这个常见的MATLAB习语寻找一个好的映射:
因此,比较一个数组和一个标量,返回一个具有相同形状的布尔数组。
我知道 Eigen 的Array类具有系数比较运算符,但如果我正确解释文档,它们只能与另一个数组一起使用;不是标量值。
是否有一些我错过的选项可以与标量进行比较?或者如果做不到这一点,创建一个形状适当的数组的一种很好的惯用方法,该数组填充了表达式的 RHS 的标量值?
c++ - 将这个模板函数专门用于 int8_t 和 uint8_t 的更好方法是什么?
考虑下面的模板dump
函数:
如您所见,我已经复制/粘贴/编辑了它以专门处理如何转储int8_t
和uint8_t
矩阵。但这正是模板应该消除的那种疯狂!
我试图向typename AsT
原始函数添加一个额外的模板参数,但一直运行与抱怨这一行的编译器发生冲突:
Xcode 抱怨它cast<AsT>()
是一个“依赖模板”并想template
在它前面插入关键字……这似乎是一种无意义的语法,然后会产生另一个编译器错误。
将这个模板函数专门用于 int8_t 和 uint8_t 的更好方法是什么?
templates - Is there a way to "force" MatrixBase::eval to happen on a template function argument?
I am working on code for a library that uses Eigen extensively, and frequently maps Eigen::Matrix
objects with an NSObject
subclass of my own design (vMAT_Array
). Working with the library often requires marshaling matrices into vMAT_Array
instances to they can be passed around, etc.
I have a vMAT_cast
template function which handles this:
The problem with this function is that it does not interact correctly with Eigen's lazy evaluation semantics. Take for example the unit test code below:
Notice the explicit .eval()
calls on most of the arguments to vMAT_cast
. These are necessary because the template function tries (at compile time) to expand into code using one of Eigen's lazy expression templates, which generates lovely error messages like this one:
I suspect there is template-fu that would "force" the MatrixBase::eval
to happen, but I lack knowledge of it. Can anyone enlighten me?
python - 如何自动化这一系列 lldb 命令?
为了解决 Apple 的lldb (rdar://13702081) 中的错误,我经常需要依次键入两个命令,如下所示:
是否可以使用可以为我组合这些步骤的 Python 库(或其他东西)编写新的lldb命令?理想情况下是这样的:
解决方案
感谢 Jason Molenda,这里是工作lldb命令脚本的输出:
我确实不得不稍微调整下面答案中提供的脚本,使用 Jason 的建议来解决带有过于复杂的表达式的lldb错误。这是我的最终脚本:
ruby - 在 ruby DSL 实现中捕获规范文件名?
我正在编写一个ruby DSL,它将用于代码生成许多Objective-C++函数。我希望每个函数的名称都源自其ruby DSL 源文件的名称。
例如,给定这个源文件clusterOptions.rb
:
当VMATCodeMonkey.new(:print)
表达式被评估时,理想情况下,我希望新对象以某种方式捕获clusterOptions.rb
源文件名。那可能吗?
如果(我怀疑)它不是,在ruby 中是否有一个很好的习惯用法来完成此功能[例如,使源文件名有效地成为 DSL 捕获的规范的一部分] ?
[虽然我怀疑不可能完全按照我所描述的那样做,但我还是问了,因为我不止一次对ruby 的晦涩功能感到惊讶。]
编辑:我知道__FILE__
;我正在寻找的是一些以 DSL 为中心的方式来捕获 DSL 源文件的名称,而无需__FILE__
在 DSL 源中明确提及。嗯,现在我正在尝试解释它,也许是从类initialize
方法中爬取堆栈跟踪?
解决方案
感谢 tadman,这是我的VMATCodeMonkey#initialize
方法:
这就是它捕获的内容: