矢量化是指一种编程范例,其中函数一次性在整个数组上运行。这在函数调用,存储器访问,并行化和代码表达方面提供了好处。某些编程语言(如MATLAB)经过优化,可在向量化时提供最佳性能。
我在 Windows 10 上使用 Visual Studio 2022。我的处理器:Intel(R) Core(TM) i5-8265U CPU @ 1.60GHz 1.80 GHz。 这是代码: #包括 #包括 #包括 我在 Windows 10 上使用 Visual Studio 2022。我的处理器:Intel(R) Core(TM) i5-8265U CPU @ 1.60GHz 1.80 GHz。 这是代码: #include <vector> #include <iostream> #include <time.h> using namespace std; void func(int* A, int na) { for (int k = 0; k < na; k++) for (int i = 0; i < na; i++) for (int j = 0; j < na; j++) A[j] = A[j] + 1; } int main() { int na = 5000; int* aint = new int[na]; func(aint, na); cout << aint[rand() % na]; delete[] aint; } MSVC 选项: cl /c /Zi /W3 /WX- /诊断:列 /sdl /O2 /Oi /GL /D NDEBUG /D _CONSOLE /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /Gy /arch:AVX2 / Zc:wchar_t /Zc:forScope /Zc:inline /permissive- /Fo"x64\Release\" /Fd"x64\Release c143.pdb" /external:W3 /Gd /TP /FC /errorReport:prompt /Qvec-report :2 源码.cpp MSVC 不对 j 循环进行矢量化。由于代码 1300:“循环体包含很少或没有计算”,循环的日志未矢量化。 MSVC CPU 时间为 17 秒,由于 Intel Advisor 诊断,j 循环未矢量化。 Intel 2024 C/C++ 编译器 CPU 时间为 7 秒,由于 Intel Advisor 诊断,j-loop 通过使用 AVX2 指令进行矢量化。我是否遗漏了应该在 MSVC 选项中设置的内容,或者 MSVC 2022 在自动矢量化方面就是那么愚蠢?您能举一个 MSVC 使用自动矢量化的例子吗?对于我尝试过的所有示例,MSVC 不会矢量化。 我尝试指定不同的增强指令集,但都不起作用。 你的循环很奇怪;最好的优化是展开外部循环,这样就有一个循环可以完成 A[j] += na*na; 的任务。 如果您以这种方式编写源代码,我希望编译器能够自动矢量化。 使用当前源,Clang 会自动矢量化,无需重新排列循环,并且一次仅添加 1。 GCC 将两者混合用于独立的 func,其中 na 是运行时变量。 将 func 内联到 main 中时,GCC 不会自动矢量化,其中 na = 5000 是编译时常量。 但它交换了一些循环,因此它在内循环中执行 add edx, 4,以 sub eax, 2 / jnz 作为循环条件,以 eax=2500 作为内循环计数器开始。 它仅在中间循环中从数组加载和存储,加载提升/存储沉入内部循环。 (中间循环像源一样运行 5000 次迭代)。只有外部循环实际递增指针,因此在指针递增之间有 5000 次加载/存储同一数组元素。 (外部循环条件是一个指针与指向数组末尾一位的指针进行比较,来自 lea rdi, [rax+20000]) 在 func 的独立非内联版本中,GCC 将 k 或 i 展开 2 并在 j 上进行矢量化,而不交换任何循环,因此它在嵌套循环中执行 A[j + 0..7] += 2;,循环遍历每次通过内循环时 std::vector。 GCC 给 main 一个隐式的 __attribute__((cold)),但是当内联到 void foo() 时,我们得到与 int main() 相同的代码,所以关键的区别似乎是 na 是一个编译时常量,而不是cold 属性(减少优化和/或偏爱大小而不是速度)。 MSVC 确实使用 size_t j(使用 -O2 -arch:AVX2)进行自动矢量化,所以也许它无法证明 32 位 j 符号扩展到 64 位指针宽度? 希望 MSVC 确实知道 j < na 条件使循环绝对是非无限的,这样它就可以避免内部循环内的符号扩展。 在带有 MSVC 19.40 的 Godbolt 上 movsxd 中唯一的 func 指令位于函数顶部以进行符号扩展 na,内部循环使用 64 位 rcx 作为计数器(无缘无故) ;计数不能高于 2^31 - 1,这样 REX 前缀就会浪费代码大小)。 我链接了int版本;取消注释 size_t 行即可查看 asm。 (滚动到底部;由于包含 <iostream>,MSVC 吐出了很多东西。我还包含了 GCC 和 Clang -O2 -march=x86-64-v3,这相当于您的 MSVC 命令:使用 AVX2+FMA3+BMI1/2 进行全面优化) 其他编译器不关心 int 与 size_t j,除非在汇编中有我没有注意到的差异。
我读了很多关于逻辑运算符的短形式和长形式之间的区别的帖子,但我需要明确的精度。 我读到: 较长的形式从左到右检查...
我试图根据参考数据帧上的相邻值将类别与向量中的每个字符串进行匹配。本质上,这与 Excel 中的 vlookup 相同。 这是 v 的示例...
我正在尝试将矢量化数据(文件格式 .npz)添加到我的 Azure OpenAI 聊天机器人,以便使其根据此数据生成答案。 问题是我尝试观看各种视频,但没有任何帮助......
我正在使用编译器资源管理器并遇到异常(我认为)。如果我想让编译器使用 libmvec 对 sin 计算进行向量化,我会写: #包括 #def...
我正在使用酒店评论数据集构建用于情感分析的 LSTM 模型。但是,每次运行代码时,模型总是返回空的输出和参数。 我已经关注我了...
矢量化或相对接近 C 速度的东西,其中每个结果取决于先前的结果。目前使用 Pandas apply() 没有显式循环
拥有一个具有下一个结构的数据框,其中的列具有布尔值: 启用器1 禁用器1 启用器2 禁用器2 0 假假假假假 1 对错...
我在 MS Visual Studio 2010 中使用适用于 Windows 操作系统的 Intel C++ 编译器 v.13。该编译器支持向量化代码。我想禁用此选项,但保存启用-O2优化。我为这个目标设定...
递归计算。每个结果都取决于之前的结果。目前使用 Pandas apply() 没有显式循环。需要更有效的解决方案
拥有一个具有下一个结构的数据框,其中的列具有布尔值: 启用器1 禁用器1 启用器2 禁用器2 0 假假假假假 1 对错...
递归计算。基于 Pandas .apply() 的当前无循环解决方案的更有效解决方案。 NumPy 的替代品?赛通?
拥有一个具有下一个结构的数据框,其中的列具有布尔值: 启用器1 禁用器1 启用器2 禁用器2 0 假假假假假 1 对错...
我有两个数据框: 一件有购买的 df_buy = pl.DataFrame( { "购买ID": [1, 2], “项目”:[“A”,“A”], “购买日期”:[日期。
导入openai openai.api_key = "YOUR_API_KEY" text = “这是您要为其创建嵌入的文本。” 响应 = openai.Embed.create(engine="text-davinci-002...
我有一个带有整数的 1D numpy numpy 数组,当且仅当下一个非零值相同时,我想用前一个非零值替换零。 例如,一个数组: 在:x = np。
我在 Pandas 中有一个数据集,其中包含电话呼叫日志,从多个主叫号码到多个目的地号码。通话一完成就会被记录。 主要特点: unix_timestamp (
我有一个包含价格和进场退出信号的数据框,并且想要计算盈亏而不循环数据框: 如果信号==“入场(空头)”,我将做空 A 并买入 B,反之亦然 &q...
在非数组输入上强制执行类似数组的行为的最“Pythonic”方式?
我正在开发一个计算和操作整数分布的个人项目,用于 DnD 和探路者等系统中的应用。 我正在寻找可以查询概率的函数......
我正在开发一个使用 NumPy 生成随机图块地图的 Python 项目。虽然我的代码可以正常运行,但目前速度太慢,而且我正在努力对其进行有效矢量化以提高性能...
我需要滚动数据帧并根据第 1 列和第 2 列中的先前值更新第 2 列中的估计。我正在寻找有关如何矢量化此方法/加速它的想法...
Solve_ivp 是来自 Scipy 的初始值问题求解器函数。 简单来说 scipy.integrate.solve_ivp(乐趣,t_span,y0,方法='RK45',t_eval=无,dense_output=False,事件=无,矢量化=...
为什么我的 %xmm3 寄存器使用 vbroadcastsd 中的第一个参数而不是第四个?
我正在尝试在汇编中实现一个函数,该函数使用 SIMD 向量指令和寄存器进行一些基本计算。函数签名为 void map_poly_double_vec(double* input, dou...