- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试将我的代码优化到最后一个可能的循环,并且想知道循环类型在用于数组索引时是否会影响性能?
我用下面的程序做了一些实验,它只用 0 填充数组:
int main(int argc, char **argv)
{
typedef int CounterType;
typedef int64_t CounterType;
CounterType N = atoi(argv[1]);
uint8_t volatile dummy[N + 16];
__m128i v = _mm_set1_epi8(0);
for (int j = 0; j < 1000000; ++j)
{
#pragma nounroll
for (CounterType i = 0; i <= N; i+= CounterType(16))
{
_mm_storeu_si128((__m128i *)&dummy[i], v);
}
}
return 0;
}
通过使用不同的循环计数器类型(CounterType)和不同的编译器,我已经使用硬件性能计数器(“perf stat a.out 32768”)记录了内循环的汇编代码和性能。我在 Xeon 5670 上运行。
GCC4.9,内部
.L3
movups %xmm0, (%rax)
addq $16, %rax
movl %eax, %edx
subl %esi, %edx
cmpl %ecx, %edx
jle .L3
4,127,525,521 cycles # 2.934 GHz
12,304,723,292 instructions # 2.98 insns per cycle
GCC4.9, int64
.L7
movups %xmm0, (%rcx,%rax)
addq $16, %rax
cmpq %rax, %rdx
jge .L7
4,123,315,191 cycles # 2.934 GHz
8,206,745,195 instructions # 1.99 insns per cycle
ICC11, int64
..B1.6:
movdqu %xmm0, (%rdx,%rdi)
addq $16, %rdx
incq %rcx
cmpq %rbx, %rcx
jb ..B1.6 # Prob 82% #24.5
2,069,719,166 cycles # 2.934 GHz
5,130,061,268 instructions
(因为微操作融合而更快?)
ICC11,整数
..B1.6: # Preds ..B1.4 ..B1.6
movdqu %xmm0, (%rdx,%rbx) #29.38
addq $16, %rdx #24.37
cmpq %rsi, %rdx #24.34
jle ..B1.6 # Prob 82% #24.34
4,136,109,529 cycles # 2.934 GHz
8,206,897,268 instructions
ICC13、整数和整数64
movdqu %xmm0, (%rdi,%rax) #29.38
addq $16, %rdi #24.37
cmpq %rsi, %rdi #24.34
jle ..B1.7
4,123,963,321 cycles # 2.934 GHz
8,206,083,789 instructions # 1.99 insns per cycle
数据似乎表明 int64 更快。也许这是因为它匹配指针大小,因此避免了任何转换。但我不相信这个结论。另一种可能性可能是编译器在某些情况下决定在存储之前进行循环比较,以 1 条额外指令为代价实现更多并行性(由于 X86 2 操作数指令具有破坏性)。但这是偶然的,并不是由循环变量类型引起的。
有人可以解释这个谜团吗(最好了解编译器转换)?
CUDA C 最佳实践指南中也声称有符号循环计数器比无符号循环计数器更容易生成代码。但这在这里似乎并不相关,因为地址计算的内部循环中没有乘法,因为该表达式被转换为归纳变量。但显然在 CUDA 中,它更喜欢使用乘加法来计算地址,因为 MADD 是 1 条指令,就像加法一样,它可以将寄存器使用减少 1。
最佳答案
是的,循环变量类型会影响效率。
让我建议 an even better solution with GCC .
void distance(uint8_t* dummy, size_t n, const __m128 v0)
{
intptr_t i;
for(i = -n; i < 0; i += 4) {
_mm_store_ps(&((float*)dummy)[i+n], v0);
}
}
对于 GCC 4.9.2 和 GCC 5.3,这会产生这个主循环
.L5:
vmovaps %xmm0, (%rdi,%rax)
addq $16, %rax
js .L5
不过 Clang 3.6 仍然会生成 cmp
.LBB0_2: # =>This Inner Loop Header:
vmovaps %xmm0, 8(%rdi,%rax)
addq $4, %rax
cmpq $-4, %rax
jl .LBB0_2
Clang 3.7 展开四次并使用 cmp
。
ICC 13 展开两次并使用 cmp
因此只有 GCC 能够在没有不必要的 cmp
指令的情况下做到这一点。
关于c - 索引数组时循环变量类型会影响效率吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23644897/
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How to nest OR statements in JavaScript? 有没有办法做到这一点:
在 JavaScript 中有没有办法让一个变量总是等于一个变量?喜欢var1 = var2但是当var2更新,也是var1 . 例子 var var1 = document.getElementBy
我正在努力理解这代表什么 var1 = var2 == var3 我的猜测是这等同于: if (var2 == var3): var1 = var2 最佳答案 赋值 var1 = var2
这个问题已经有答案了: What does the PHP error message "Notice: Use of undefined constant" mean? (2 个回答) 已关闭 8
我在临时表中有几条记录,我想从每条记录中获取一个值并将其添加到一个变量中,例如 color | caption -------------------------------- re
如何将字符串转为变量(字符串变量--> $variable)? 或者用逗号分隔的变量列表然后转换为实际变量。 我有 2 个文件: 列名文件 行文件 我需要根据字符串匹配行文件中的整行,并根据列名文件命
我有一个我无法解决的基本 php 问题,我也想了解为什么! $upperValueCB = 10; $passNodeMatrixSource = 'CB'; $topValue= '$uppe
这可能吗? php $variable = $variable1 || $variable2? 如果 $variable1 为空则使用 $variable2 是否存在类似的东西? 最佳答案 PHP 5
在 Perl 5.20 中,for 循环似乎能够修改模块作用域的变量,但不能修改父作用域中的词法变量。 #!/usr/bin/env perl use strict; use warnings; ou
为什么这不起作用: var variable; variable = variable.concat(variable2); $('#lunk').append(variable) 我无法弄清楚这一点
根据我的理解,在32位机器上,指针的sizeof是32位(4字节),而在64位机器上,它是8字节。无论它们指向什么数据类型,它们都有固定的大小。我的计算机在 64 位上运行,但是当我打印包含 * 的大
例如: int a = 10; a += 1.5; 这运行得很完美,但是 a = a+1.5; 此作业表示类型不匹配:无法从 double 转换为 int。所以我的问题是:+= 运算符 和= 运算符
您好,我写了这个 MySQL 存储过程,但我一直收到这个语法错误 #1064 - You have an error in your SQL syntax; check the manual that
我试图在我的场景中显示特定的奖牌,这取决于你的高分是基于关卡的目标。 // Get Medal Colour if levelHighscore goalScore { sc
我必须维护相当古老的 Visual C++ 源代码的大型代码库。我发现代码如下: bIsOk = !!m_ptr->isOpen(some Parameters) bIsOk的数据类型是bool,is
我有一个从 MySQL 数据库中提取的动态产品列表。在 list 上有一个立即联系 按钮,我正在使用一个 jquery Modal 脚本,它会弹出一个表单。 我的问题是尝试将产品信息变量传递给该弹出窗
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
jQuery Core Style Guidelines建议两种不同的方法来检查变量是否已定义。 全局变量:typeof variable === "undefined" 局部变量:variable
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: “Variable” Variables in Javascript? 我想肯定有一种方法可以在 JavaScrip
在语句中使用多重赋值有什么优点或缺点吗?在简单的例子中 var1 = var2 = true; 赋值是从右到左的(我相信 C# 中的所有赋值都是如此,而且可能是 Java,尽管我没有检查后者)。但是,
我是一名优秀的程序员,十分优秀!