Tag: 性能

这是计算nCr的更好方法

方法1: C(n,r)= n!/(nr)!r! 方法2: 在wilf的“ Combinatorial Algorithms ”一书中,我发现了这个: C(n,r)可写为C(n-1,r) + C(n-1,r-1) 。 例如 C(7,4) = C(6,4) + C(6,3) = C(5,4) + C(5,3) + C(5,3) + C(5,2) . . . . . . . . After solving = C(4,4) + C(4,1) + 3*C(3,3) + 3*C(3,1) + 6*C(2,1) + 6*C(2,2) 如您所见,最终解决方案不需要任何乘法。 在每种formsC(n,r)中,n == r或r == 1。 这是我实现的示例代码: […]

测量缓存延迟

所以我试图用C测量L1,L2,L3缓存的延迟。我知道它们的大小,我觉得我从概念上理解如何做到这一点,但我遇到了我的实现问题。 我想知道一些其他硬件错综复杂如预取是否会导致问题。 #include #include #include int main(){ srand(time(NULL)); // Seed ONCE const int L1_CACHE_SIZE = 32768/sizeof(int); const int L2_CACHE_SIZE = 262144/sizeof(int); const int L3_CACHE_SIZE = 6587392/sizeof(int); const int NUM_ACCESSES = 1000000; const int SECONDS_PER_NS = 1000000000; int arrayAccess[L1_CACHE_SIZE]; int arrayInvalidateL1[L1_CACHE_SIZE]; int arrayInvalidateL2[L2_CACHE_SIZE]; int arrayInvalidateL3[L3_CACHE_SIZE]; int count=0; int index=0; int i=0; struct timespec startAccess, endAccess; double […]

为什么GCC __builtin_prefetch不能提高性能?

我正在编写一个程序来分析社交网络图。 这意味着程序需要大量的随机内存访问。 在我看来,预取应该有所帮助。 这是从顶点的邻居读取值的一小段代码。 for (size_t i = 0; i < v.get_num_edges(); i++) { unsigned int id = v.neighbors[i]; res += neigh_vals[id]; } 我将上面的代码转换为下面的代码,并预取顶点的邻居值。 int *neigh_vals = new int[num_vertices]; for (size_t i = 0; i < v.get_num_edges(); i += 128) { size_t this_end = std::min(v.get_num_edges(), i + 128); for (size_t j = i; j < […]

为什么memcmp比for循环检查快得多?

为什么memcmp(a, b, size)比以下快得多: for(i = 0; i < nelements; i++) { if a[i] != b[i] return 0; } return 1; memcmp是CPU指令还是什么? 它必须非常深,因为我在循环中使用memcmp获得了大量的加速。

查找给定整数的所有精确除数的算法

我想找到一个数字的所有确切除数。 目前我有这个: { int n; int i=2; scanf(“%d”,&n); while(i<=n/2) { if(n%i==0) printf("%d,",i); i++; } getch(); } 有没有办法改善它?

获取CPU周期数?

我在SO上看到这篇包含C代码的post来获取最新的CPU周期数: 基于CPU周期计算的C / C ++ Linux x86_64中的分析 有没有办法在C ++中使用这段代码(欢迎使用windows和linux解决方案)? 虽然用C语言编写(而C是C ++的一个子集)但我不太确定这段代码是否适用于C ++项目,如果没有,如何翻译呢? 我使用的是x86-64 EDIT2: 找到此function但无法让VS2010识别汇编程序。 我需要包含任何内容吗? (我相信我必须将uint64_t交换为多long long的窗口……?) static inline uint64_t get_cycles() { uint64_t t; __asm volatile (“rdtsc” : “=A”(t)); return t; } EDIT3: 从上面的代码我得到错误: “错误C2400:’操作码’中的内联汇编语法错误;找到’数据类型’” 有人可以帮忙吗?

在x86和x64上读取同一页面内的缓冲区末尾是否安全?

如果允许在输入缓冲区末尾读取少量数据,那么在高性能算法中发现的许多方法都可以(并且被简化)。 这里,“少量”通常意味着超过结尾的W – 1个字节,其中W是算法的字节大小(例如,对于处理64位块中的输入的算法,最多7个字节)。 很明显, 写入输入缓冲区的末尾通常是不安全的,因为您可能会破坏缓冲区1之外的数据。 同样清楚的是,将缓冲区的末尾读取到另一页面可能会触发分段错误/访问冲突,因为下一页可能不可读。 但是,在读取对齐值的特殊情况下,页面错误似乎是不可能的,至少在x86上是这样。 在该平台上,页面(以及因此内存保护标志)具有4K粒度(较大的页面,例如2MiB或1GiB,可能,但这些是4K的倍数),因此对齐的读取将仅访问与有效页面相同的页面中的字节缓冲区的一部分。 这是一个循环的规范示例,它对齐其输入并在缓冲区末尾读取最多7个字节: int processBytes(uint8_t *input, size_t size) { uint64_t *input64 = (uint64_t *)input, end64 = (uint64_t *)(input + size); int res; if (size = 0) { return input + res; } // align pointer to the next 8-byte boundary input64 = (ptrdiff_t)(input64 + 1) & ~0x7; for […]

如何在C中最好地编写体素引擎并考虑到性能

我是OpenGl中的一个电枢,因此我只想学习现代OpenGl 4.x的东西。 一旦我完成了基本教程(例如旋转立方体),我决定尝试创建一个基于体素的程序,仅处理立方体。 这个程序的目标是快速,使用有限的CPU功率和内存,并且是动态的,因此地图大小可以改变,只有在数组中它表示块被填充时才会绘制块。 我有一个VBO,其中包含由三角形构成的立方体的顶点和索引。 一开始,如果渲染函数我告诉OpenGl要使用的着色器,然后在完成后绑定VBO我执行此循环 绘制立方体循环: //The letter_max are the dimensions of the matrix created to store the voxel status in // The method I use for getting and setting entries in the map are very efficient so I have not included it in this example for(int z = -(z_max / 2); z < […]

快速跨平台C / C ++图像处理库

什么是用于图像处理的一些跨平台和高性能图像库(resize和查找颜色/色调直方图)。 不需要gui。 这适用于C / C ++。 到目前为止,我一直在寻找 OpenCV的 GIL是Boost的一部分 魔鬼 CIMG 我的问题 我上面列出的那些表现如何 还有什么其他的图书馆 您的意见非常感谢。

clflush通过C函数使缓存行无效

我试图使用clflush手动驱逐缓存行,以确定缓存和行大小。 我没有找到关于如何使用该指令的任何指南。 我所看到的,是一些使用更高级别function的代码。 有一个内核函数void clflush_cache_range(void *vaddr, unsigned int size) ,但我仍然不知道在我的代码中包含什么以及如何使用它。 我不知道该function的size是多少。 更重要的是,我怎样才能确定该行被驱逐以validation我的代码的正确性? 更新: 这是我想要做的初始代码。 #include #include #include #include int main() { int array[ 100 ]; /* will bring array in the cache */ for ( int i = 0; i < 100; i++ ) array[ i ] = i; /* FLUSH A LINE */ /* […]