小编jme*_*lfe的帖子

使用内联链接在冲突定义上生成错误

今天我偶然发现了一个好奇的虫子,到目前为止我已经设法避开了.

file1.cpp:

#include <iostream>
inline void print() { std::cout << "Print1\n"; }
void y() { print(); }
Run Code Online (Sandbox Code Playgroud)

file2.cpp:

#include <iostream>
inline void print() { std::cout << "Print2\n"; }
void x() { print(); }
Run Code Online (Sandbox Code Playgroud)

main.cpp中:

int x();
int y();

int main(){
    x();
    y();
}
Run Code Online (Sandbox Code Playgroud)

输出:

Print1                         (Expected Print2)
Print1
Run Code Online (Sandbox Code Playgroud)

因为print()具有内联链接,所以不会产生多重定义错误(使用编译g++ -Wall file1.cpp file2.cpp main.cpp),并且重复符号会以静默方式折叠.我看到的实际情况是使用内联类方法,而不是显式内联函数,但效果是相同的.

我想知道是否有一个链接器选项或类似的东西,这将允许我在出现这种类型的错误时产生警告?

c++ linker inline

7
推荐指数
1
解决办法
287
查看次数

软件在x86上跨页边界预取

我的理解是硬件预取永远不会跨越页面边界.我想知道软件预取是否有相同的限制,即我可以使用软件预取来避免未来的TLB未命中.从搜索周围来看,它似乎是可能的,但我在文档中找不到任何确定的内容,因此引用会很好.

我对Nehalem,Sandy Bridge和Westmere特别感兴趣.

x86 prefetch tlb nehalem

6
推荐指数
1
解决办法
1182
查看次数

在x86上简单的PAPI分析中出现了大量的TLB未命中

我正在使用PAPI高级API检查循环通过数组的简单程序中的TLB未命中,但看到的数字大于预期.

在其他简单的测试用例中,结果似乎非常合理,这使我认为结果是真实的,额外的遗漏是由硬件预取或类似的.

任何人都可以解释这些数字或指出我使用PAPI时出现的错误吗?

int events[] = {PAPI_TLB_TL};
long long values[1];
char * databuf = (char *) malloc(4096 * 32);

if (PAPI_start_counters(events, 1) != PAPI_OK) exit(-1);
if (PAPI_read_counters(values, 1) != PAPI_OK) exit(-1); //Zeros the counters

for(int i=0; i < 32; ++i){
    databuf[4096 * i] = 'a';
}

if (PAPI_read_counters(values, 1) != PAPI_OK) exit(-1); //Extracts the counters

printf("%llu\n", values[0]);
Run Code Online (Sandbox Code Playgroud)

我期望打印的数字在32或至少一些倍数的区域内,但始终得到93或更高的结果(不是始终高于96,即每次迭代不仅仅是3次未命中).我正在运行固定到核心,没有别的东西(除了计时器中断).

我在Nehalem并没有使用大页面,因此DTLB中有64个条目(L2中为512个).

c x86 tlb nehalem papi

2
推荐指数
1
解决办法
529
查看次数

标签 统计

nehalem ×2

tlb ×2

x86 ×2

c ×1

c++ ×1

inline ×1

linker ×1

papi ×1

prefetch ×1