错误、漏洞、问题 - 页 2506

 
Vict:
说明理由

寄存器的单位是比特,而不是字节。因此,这一行在代码的其余部分被错误地使用。

#define  CACHE_LINE_SIZE 64
 
Francuz:

寄存器的单位是比特,而不是字节。因此,这一行在代码的其余部分被错误地使用。

不,你在说一些奇怪的话。我不打算证明它。看一下处理器上的文件,请看这里https://stackoverflow.com/questions/7281699/aligning-to-cache-line-and-knowing-the-cache-line-size/7284876

在X86上,高速缓存行是64字节。

我不需要登记,我根本就不谈这些问题。

Aligning to cache line and knowing the cache line size
Aligning to cache line and knowing the cache line size
  • 2011.09.02
  • MetallicPriestMetallicPriest 12.1k2929 gold badges135135 silver badges259259 bronze badges
  • stackoverflow.com
To prevent false sharing, I want to align each element of an array to a cache line. So first I need to know the size of a cache line, so I assign each element that amount of bytes. Secondly I want the start of the array to be aligned to a cache line. I am using Linux and 8-core x86 platform...
 
Vict:

不,你在说一些奇怪的话。我不打算证明它。看一下处理器的文档,请看这里https://stackoverflow.com/questions/7281699/aligning-to-cache-line-and-knowing-the-cache-line-size/7284876

我不需要登记,我根本就不谈这些问题。

嗯...好的。 (清嗓子)总之,每个型号的缓存都不一样。没有办法从软件中知道它的大小。这就是为什么把它作为一个指南是愚蠢的。但所有的处理器都有两种类型的寄存器,熟练的程序员关注的是寄存器的大小。即使是这种寄存器导向也不一定成功,因为编译器和操作系统位于程序和处理器之间。

此外,这条线路的计算方法是不正确的,没有登记。

int index = int(CACHE_LINE_SIZE - getaddr(data[rndnum].ar[0]) % CACHE_LINE_SIZE) / sizeof(int);
 
Francuz:

嗯...好的。总之,不同的处理器的缓存是不同的。而且没有办法从软件中知道它的大小。这就是为什么以它为指导是愚蠢的。但所有的处理器都有两种类型的寄存器,熟练的程序员关注的是寄存器的大小。而且,即使是以寄存器大小为目标也不一定能拯救你,因为编译器和操作系统位于程序和处理器之间。

同样,事情在不断发展,越来越强调多线程,这里有一个跨std库来告诉你这一切

https://en.cppreference.com/w/cpp/thread/hardware_destructive_interference_size

此外,这条线路的计算方法是不正确的,没有考虑到登记。
也许吧,但到目前为止,你还没有说服我。
std::hardware_destructive_interference_size, std::hardware_constructive_interference_size - cppreference.com
  • en.cppreference.com
These constants provide a portable way to access the L1 data cache line size.
 
Vict:

同样不是,事情在发展,越来越多的人强调多线程,在这里你可以看到--cross std库会告诉你一切。

https://en.cppreference.com/w/cpp/thread/hardware_destructive_interference_size

也许吧,但到目前为止,你还没有说服我。

它不会告诉你,它会告诉你。仔细阅读说明书。


关于交易、自动交易系统和交易策略测试的论坛

也许吧,但到目前为止,你还没有说服我。

虽然我不太清楚你想要什么转变,但这很容易理解:绝对地址在计算中完全没有用。你难道忘了,内存的参考点是结构的地址吗?而你可能想获得一个结构内存块中的数组的偏移量?而这就是结构的地址和数组的空元素之间的差异得到的结果。

 
Artyom Trishkin:

如果缓冲区内没有酒吧的值,应该明确写入缓冲区内。也就是说,如果计算出的值应该输出到缓冲区,我们就把它写到缓冲区,否则,我们就写一个空值。

谢谢你,Artem。

 
Francuz:

虽然我不太清楚你想要什么偏移量,但很容易理解这个错误:绝对地址在计算中完全没有用。 你难道忘了,内存的参考点是结构地址吗?而你可能想获得一个结构内存块中的数组的偏移量?而这就是结构的地址和数组的零元素之间的区别。

int index = int(CACHE_LINE_SIZE - getaddr(data[rndnum].ar[0]) % CACHE_LINE_SIZE) / sizeof(int);
                                3        1                    2                  4

依次采取行动。

1 - 获得当前数据结构中第一个ar[]元素的地址。

2.找出它从高速缓存行开始的偏移量

3.找出从它到缓存行末端的多少个字节

4.找出这个空间能容纳多少个字节,直到缓存行的结束。


你在你的电脑上运行了吗?速度上有区别吗?或者只是我的问题?

 
Vict:

2.找出它从高速缓存行开始的偏移量

你怎么会认为这是找出其偏移量的任何方法?

 
是什么导致了这种减速?

关于交易、自动交易系统和交易策略测试的论坛

虫子,虫子,问题

fxsaber, 2019.07.09 11:13

   Data data[];
   
   ArrayResize(data, 32768);

有一个6倍的减速发生!

 
fxsaber:
这些刹车是用来做什么的?
动态数组 有更多的检查,Renat曾经写过,我找不到帖子了,只是说到了索引访问,为什么它明显比正数慢?