我使用英特尔®架构代码分析器(IACA)发现了一些意想不到的东西(对我而言).
以下指令使用[base+index]寻址
addps xmm1, xmmword ptr [rsi+rax*1]
Run Code Online (Sandbox Code Playgroud)
根据IACA没有微熔丝.但是,如果我用[base+offset]这样的
addps xmm1, xmmword ptr [rsi]
Run Code Online (Sandbox Code Playgroud)
IACA报告它确实融合了.
英特尔优化参考手册的第2-11节给出了以下"可以由所有解码器处理的微融合微操作"的示例
FADD DOUBLE PTR [RDI + RSI*8]
Run Code Online (Sandbox Code Playgroud)
和Agner Fog的优化装配手册也给出了使用[base+index]寻址的微操作融合的例子.例如,请参见第12.2节"Core2上的相同示例".那么正确的答案是什么?
假设我们有一系列这样的整数:
const int size = 100000;
int array[size];
//set some items to 0 and other items to 1
Run Code Online (Sandbox Code Playgroud)
我想将所有值为1的项替换为另一个值,例如123456.这可以通过以下方式轻松实现:
for(int i = 0; i < size ; i++){
if(array[i] != 0)
array[i] = 123456;
}
Run Code Online (Sandbox Code Playgroud)
出于好奇,有没有更快的方法来做到这一点,通过某种x86技巧,或者这是处理器的最佳代码?
我有一块内存块,其中包含固定大小的元素,比如说100个字节,一个接一个地放入,所有内容都有相同的固定长度,所以内存看起来像这样
<element1(100 bytes)><element2(100 bytes)><element3(100 bytes)>...
Run Code Online (Sandbox Code Playgroud)
在某些情况下,我需要确定某个元素的所有字节是否都设置为0字节,因为它具有特殊含义(我没有说这是一个好主意,但这就是我所处的情况).
问题是,我该如何有效地做到这一点.进一步:有一个简单的功能来做到这一点.为了将字节设置为零,我可以使用memset或bzero,但我不知道检查零的任何函数.
目前我正在使用循环进行检查
char *elementStart = memoryBlock + elementNr*fixedElementSize;
bool special = true;
for ( size_t curByteNr=0; curByteNr<fixedElementSize; ++curByteNr )
{
special &= (*(elementStart+curByteNr)) == 0;
}
Run Code Online (Sandbox Code Playgroud)
当然,我可以使用更大的偏移量循环,并使用mword或其他更适合的更大类型一次检查几个字节.我想这样会很有效率,但我想知道是否有一种功能可以减轻我的负担.
建议功能:
我有大量的数据,可能是4MB.现在想检查它中的所有位是否为0.
例如:这是数据:
void* data = malloc(4*1024*1024);
memset(data, 0, 4*1024*1024);
Run Code Online (Sandbox Code Playgroud)
检查它中的所有位是否为0.这是我的解决方案不够快:
int dataisnull(char* data, int length)
{
int i = 0;
while(i<length){
if (data[i]) return 0;
i++;
}
return 1;
}
Run Code Online (Sandbox Code Playgroud)
此代码可能在性能方面有一些改进.例如,在32/64位机器中,一次检查4/8字节可能更快.
所以我想知道最快的方法是什么?
我在内存中有一个字节数组.查看数组中所有字节是否为零的最快方法是什么?
TL;DR 我想知道如何清理第一个 if 语句。我尝试在网上查找,但一无所获。
我正在编写一个程序来测试用户输入的数字是否有重复的数字。我设法创建了一个 10 元素的布尔数组 (a[10]),如果 a[i] 等于 0,这意味着数字 'i' 最多出现一次。如果 a[i] 等于 1,则数字 'i' 在键入的数字中至少出现两次(因此重复)。注意 0<=i<=9。
现在我试图分析这个数组中的值,如果所有值都为零,那么我们输入“重复数字”。如果不是,我们就说哪些数字是重复的。
if(a[0] == 0 && a[1] == 0 && a[2] == 0 && a[3] == 0 && a[4] == 0 && a[5] == 0 && a[6] == 0 && a[7] == 0 && a[8] == 0 && a[9] == 0)
printf("No repeated digits");
else
printf("Repeated digits: ");
for(i = 0; i < 10; i++) {
if(a[i] == 1)
printf("%d ", i); …Run Code Online (Sandbox Code Playgroud)