相关疑难解决方法(0)

微融合和寻址模式

我使用英特尔®架构代码分析器(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上的相同示例".那么正确的答案是什么?

cpu x86 assembly intel iaca

44
推荐指数
4
解决办法
4504
查看次数

替换数组中元素的快速方法 - C

假设我们有一系列这样的整数:

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技巧,或者这是处理器的最佳代码?

c arrays performance

31
推荐指数
4
解决办法
5万
查看次数

如何检查内存块中的所有字节是否为零

我有一块内存块,其中包含固定大小的元素,比如说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或其他更适合的更大类型一次检查几个字节.我想这样会很有效率,但我想知道是否有一种功能可以减轻我的负担.

建议功能:

  • !memcmp(compareBlock,myBlock,fixedElementSize)

c++

26
推荐指数
3
解决办法
3万
查看次数

如果C中为null,检查海量数据的最快方法是什么?

我有大量的数据,可能是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字节可能更快.

所以我想知道最快的方法是什么?

c performance

24
推荐指数
2
解决办法
1174
查看次数

快速检查字符数组是否为零的方法

我在内存中有一个字节数组.查看数组中所有字节是否为零的最快方法是什么?

c memory optimization performance 32-bit

19
推荐指数
2
解决办法
2万
查看次数

一种快速测试是否所有数组元素都为零的方法

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)

c

4
推荐指数
1
解决办法
197
查看次数

标签 统计

c ×4

performance ×3

32-bit ×1

arrays ×1

assembly ×1

c++ ×1

cpu ×1

iaca ×1

intel ×1

memory ×1

optimization ×1

x86 ×1