相关疑难解决方法(0)

为什么在x86上对自然对齐的变量进行整数赋值?

我一直在读这篇关于原子操作的文章,它提到了32位整数赋值在x86上是原子的,只要该变量是自然对齐的.

为什么自然对齐确保原子性?

c c++ concurrency x86 atomic

28
推荐指数
2
解决办法
5386
查看次数

如何在x86上捕获数据对齐错误(在Sparc上也称为SIGBUS)

是否有可能在i386上捕获数据对齐错误?也许通过设置i386特定的机器寄存器或类似的东西.

在Solaris-Sparc上我在这种情况下收到一个SIGBUS,但在i386上一切都很好.

环境:

  • 32位应用程序
  • Ubuntu Karmic
  • gcc/g ++ v4.4.1

编辑:这就是为什么我这样问:

  • 我们的应用程序在使用SIGBUS的Sol-Sparc上崩溃了.出于调试的目的,我会尝试在i386平台上获得类似的行为.
  • 我们的Sol-sparc机器非常慢,因此编译和调试需要很长时间.我们的i386机器速度令人难以置信(8核,32G内存).
  • 即使在i386平台上,数据对齐错误也会带来性能损失.因此,我想尽可能修复数据对齐错误.

c c++ gcc g++

15
推荐指数
2
解决办法
4363
查看次数

如何在x86_64上准确地对准未对齐的访问速度

答案中,我已经声明未对齐访问的速度与对齐访问的速度几乎相同(在x86/x86_64上).我没有任何数字来支持这个陈述,所以我已经为它创建了一个基准.

你看到这个基准测试有什么缺陷吗?你可以改进它(我的意思是,增加GB /秒,所以它更好地反映了真相)?

#include <sys/time.h>
#include <stdio.h>

template <int N>
__attribute__((noinline))
void loop32(const char *v) {
    for (int i=0; i<N; i+=160) {
        __asm__ ("mov     (%0), %%eax" : : "r"(v) :"eax");
        __asm__ ("mov 0x04(%0), %%eax" : : "r"(v) :"eax");
        __asm__ ("mov 0x08(%0), %%eax" : : "r"(v) :"eax");
        __asm__ ("mov 0x0c(%0), %%eax" : : "r"(v) :"eax");
        __asm__ ("mov 0x10(%0), %%eax" : : "r"(v) :"eax");
        __asm__ ("mov 0x14(%0), %%eax" : : "r"(v) :"eax");
        __asm__ ("mov 0x18(%0), %%eax" : : "r"(v) :"eax"); …
Run Code Online (Sandbox Code Playgroud)

performance benchmarking x86 x86-64 inline-assembly

5
推荐指数
1
解决办法
881
查看次数

标签 统计

c ×2

c++ ×2

x86 ×2

atomic ×1

benchmarking ×1

concurrency ×1

g++ ×1

gcc ×1

inline-assembly ×1

performance ×1

x86-64 ×1