什么是最好的NHibernate缓存二级提供者?
我已经看到其中有很多. ncache,速度等等,但我没有找到比较它们的表. 考虑到以下标准,最好的是什么: 易于理解. 最近正在维护. 是免费的或有足够的免费版本. 作品. 解决方案 我不能说最好或最坏的事情,但是我会在NCACHE有帮助的情况下提供我的经验. 免责声明:Nhibernate和我有一些分歧,我们已经走了单独的方式:) 好 表演很棒 支持很棒,它得到了很好的维护(我在6个月前就对地位说话) 它有一个免费版本(下面有警告) 它的工作原理也尽可能地工作,但是我对基本级2号缓存提供商实现遇到了问题……但这在Nhibernate方面是一个问题,而不是NCACHE方面的问题. 坏( 免费版本具有其限制,从战略上讲,它们毫无疑问,但是对于我们的项目,我们无法使用免费版本,因为某些关键功能无法使用.以下限制在免费版本上. 不包括基于密钥的依赖性 所有数据库依赖项都不包括在内 否64位版本 这些是我两个不同项目上的粘附点.
10 2024-04-20
编程技术问答社区
数组的结构、结构的数组和内存使用模式
我一直在阅读有关SOA的信息,我想尝试在我正在构建的系统中尝试实施. 我正在编写一些简单的C结构来进行一些测试,但是我有点困惑,现在我有3种不同的结构.我将在下面显示它们,然后详细介绍有关该问题的详细信息. struct vec3 { size_t x, y, z; }; struct vec3_a { size_t pos[3]; }; struct vec3_b { size_t* x; size_t* y; size_t* z; }; struct vec3 vec3(size_t x, size_t y, size_t z) { struct vec3 v; v.x = x; v.y = y; v.z = z; return v; } struct vec3_a vec3_a(size_t x, size_t y, size_t z) { struct vec3_a v; v.pos[0] = x;
18 2024-04-09
编程技术问答社区
确定Cpu缓存的关联性
我正在尝试确定处理器的关联性. 我有Intel Core i5-2500: L1数据:32 kb,8向套件的关联 l1指令:32 kb,8向套件联想 l2:256 kb,8向套件联想 l3:6 MB,12向套件的关联,所有内核之间共享 我测量了处理器刻度中数组元素的平均访问时间.阵列分为片段. 在循环中,我增加了碎片的数量.两个相邻片段之间的距离等于L3缓存大小.我访问所有片段的第一个元素,然后是第二个元素,等等.每个元素都包含下一个元素的索引.最后一个元素包含第一个索引. 看起来像这样:在此处输入图像描述 当片段数量大于缓存的关联性时,平均访问时间应增加. 我得到以下结果: 在此处输入图像描述 第一个跳跃对应于TLB的关联性,第二个跳跃对应于L1和L2缓存的关联,但是我不明白为什么在超过L3 CACHE的关联之后时间不会增加的原因. . 我还尝试了不同的尺寸和偏移 我做错了什么吗?还是我有一些错误? 您可以
18 2024-04-09
编程技术问答社区
哪些数据将被缓存?
书中cache的描述始终是非常笼统的.我是建筑领域的学生.我想更详细地了解cache的行为. 在C/C ++语言代码中,将从内存到缓存的哪些数据将加载哪些数据?经常使用时会加载到缓存中吗?例如,当我用C语言编写for循环时,我经常使用变量i, j, and k.这些还会加载到缓存中吗? C语言局部变量通常放置在堆栈区域中,全局变量将放置在数据区域中?使用时,它们会首先加载到缓存中吗?数据是否必须通过缓存才能到达寄存器,然后到达CPU? 指针变量p存储数据的地址.如果我使用指针*p访问变量. p是否会首先加载到缓存中,然后将*p加载到缓存中? 解决方案 通常,您的C ++程序使用(代码和数据)的所有内存都在可缓存的内存中. 对任何C ++对象的任何访问(读取或写入) 1 将导致缓存线包含它是热的,以防万一,假设有一个正常的CPU缓存:set-sassociative - 将 1 配置,即使它以前不是热. 最简单的设计是,每个缓存级别都通过下一个外层获取数据,
10 2024-04-09
编程技术问答社区
可能的指令缓存同步问题在自我修改的代码中?
许多相关问题 x86指令如何同步? >提及X86应在自修改代码中正确处理I-CACHE同步.我编写了以下代码,该代码可以从与执行情况交织在一起的不同线程打开和关闭函数.我将比较和交换操作用作额外的后卫,以使修改是原子.但是,如果处理器试图执行部分更新的说明,我正在遇到间歇性崩溃(Sigsegv,Sigill)并分析核心转储,这使我感到可疑.代码和下面给出的分析.可能我在这里缺少一些东西.让我知道是否是这种情况. toggle.c #include #include #include #include #include #include #include int active = 1; // Whether the function is toggled on or off uint8_t* funcAddr = 0; /
16 2024-04-09
编程技术问答社区
cpu缓存线和预取策略
我读了这篇文章 http://igoro.com/archive/gallery - 处理器-Cache-effects/.文章说,由于cacheline延迟,代码: int[] arr = new int[64 * 1024 * 1024]; // Loop 1 for (int i = 0; i
10 2024-04-08
编程技术问答社区
如何在C语言和java中产生cpu缓存效应?
在Ulrich Drepper的论文中CPU缓存,他显示了一个图表,该图显示了"工作集"大小和每个操作的CPU周期之间的关系(在这种情况下为顺序读取).图表中有两个跳跃指示L1 CACHE和L2 CACHE的大小.我编写了自己的程序来复制c中的效果.它只是从头到尾依次读取一个int []数组,我尝试了不同的数组(从1KB到1MB).我将数据绘制到图中,没有跳跃,该图是一条直线. 我的问题是: 我的方法有问题吗?产生CPU缓存效果的正确方法是什么? 我在想,如果是顺序阅读,则应该这样运行: 当阅读第一个元素时,它是一个缓存失误,并且在缓存线大小(64K)中,将会有命中.借助预摘要,读取下一条缓存线的延迟将被隐藏.即使工作集的大小超过L1高速缓存大小,它也会连续地将数据读取到L1缓存中,它将驱逐最近使用的数据,并继续进行预取.因此,大多数高速缓存失误将被隐藏,从L2获取数据消耗的时间将隐藏在阅读活动后面,这意味着它们同时运行.辅助性(在我的情况下为8条)将隐藏L2读取数据的延迟
18 2024-04-08
编程技术问答社区
在Linux上以编程方式获得准确的CPU缓存层次结构信息
我正在尝试对Linux上当前CPU的数据缓存层次结构进行准确描述:不仅是单个L1/L2/L3(以及可能是L4)数据缓存的大小,还包括它们分割的方式或跨核共享. 例如,在我的CPU上(AMD Ryzen Threadripper 3970x),每个核心都有自己的32 kb的L1数据缓存和512 kb的L2 CACHE,但是L3 CACHE在核心复合物(CCX)中跨核心共享.换句话说,有8个不同的L3缓存,每个缓存16 MB. Windows上CPU-Z屏幕截图的"缓存"部分基本上是我想找出的: 我毫无疑问地在Windows上使用但是,在Linux上,似乎sysconf()仅给我提供L1和L2数据缓存的每核缓存大小(_SC_LEVEL1_DCACHE_SIZE和_SC_LEVEL2_DCACHE_SIZE),或者总L3缓存大小(_SC_LEVEL3_CACHE_SIZE) ). 编辑:LSTOPO的输出在VMware 下.虚拟机有8个内核. L1和L2高速缓存信息很好
12 2024-04-08
编程技术问答社区
设计代码以适应CPU Cache?
编写模拟时,我的伙伴说他喜欢尝试将程序编写得足够小以适合缓存.这有真正的含义吗?我知道缓存比RAM和主要内存更快.是否可以指定您希望该程序从缓存运行或至少将变量加载到缓存中?我们正在编写模拟,因此任何性能/优化增益都是一个巨大的好处. 如果您知道有任何良好的链接解释了CPU缓存,请将我指向这个方向. 解决方案 至少使用典型的桌面CPU,您实际上无法直接指定太多有关缓存使用情况.不过,您仍然可以尝试编写适合缓存的代码.在代码方面,这通常意味着展开的循环(仅仅一个明显的例子)很少有用 - 它扩展了代码,现代CPU通常会最大程度地减少循环的开销.通常,您可以在数据方面做更多的事情,以提高参考的局部性,防止错误共享(例如,两个经常使用的数据将尝试使用缓存的同一部分,而其他部件仍未使用). 编辑(要使一些要点更明确): 典型的CPU具有许多不同的缓存.现代桌面处理器通常至少有2个且通常具有3个级别的缓存.通过(至少几乎)通用协议,"级别1"是与处理元素的"最接近"的缓存,
8 2024-04-08
编程技术问答社区
你如何从用户模式代码中通用地检测缓存行的关联性?
我正在为 cachegrind/callgrind工具将使用完全通用的代码,CPU指令和缓存配置自动检测(目前只有X86/X64自动配置,并且其他架构不为非特权代码提供CPUID类型配置).此代码将需要在非特权上下文(即纯用户模式代码)中完全执行.它还需要在非常不同的POSIX实现中移植,因此Grokking/proc/cpuinfo不会这样做,因为我们的目标系统之一没有这样的事情. 检测CPU的频率,缓存的数量,它们的尺寸甚至缓存线大小都可以使用100%通用POSIX代码来完成,该代码没有CPU特异性的OPCODES(只是许多合理的假设,例如很多合理的假设)因为那将两个数字添加在一起,如果没有内存或寄存器依赖性失速,则可能会在一个周期中执行).这部分非常简单. 什么不是那么简单,为什么我问stackoverflow,如何检测给定缓存的缓存线关联性?关联性是高速缓存中有多少位可以包含主内存中给定的高速缓存线.我可以看到可以检测到L1缓存关联性,但是L2缓存? L1的关联肯定会
10 2024-04-08
编程技术问答社区
通过已知的索引、聚集、分散来重新调整数组的缓存友好复制
假设我们有一系列数据和另一个带有索引的数组. data = [1, 2, 3, 4, 5, 7] index = [5, 1, 4, 0, 2, 3] 我们想从index的位置data元素创建一个新数组.结果应为 [4, 2, 5, 7, 3, 1] 幼稚算法适用于O(n),但执行随机内存访问. 您可以建议具有相同复杂性的CPU缓存友好算法. ps 在我的某些情况下,数据阵列中的所有元素都是整数. pps 阵列可能包含数百万个元素. ppps我可以使用SSE/AVX或任何其他X64特定优化 解决方案 将索引和数据组合到一个数组中.然后使用一些对缓存友好的排序算法对这些对进行排序(按索引).然后摆脱索引. (您可以将合并/删除索引与排序算法的第一/最后一个通过,以对此进行优化). 用于缓存友好的o(n)排序使用radix排序与足够小的radix(CPU缓存中最多一半的高速缓存线数). 这是radix-sort样算法的C实现:
6 2024-04-08
编程技术问答社区
CLFLUSH对于一个还没有进入缓存的地址是如何工作的?
我们正在尝试使用Intel Clflush指令在用户空间的Linux中刷新过程的缓存内容. 我们创建一个非常简单的C程序,该程序首先访问一个大数组,然后调用Clflush以冲洗整个数组的虚拟地址空间.我们测量了冲洗整个阵列所需的延迟.程序中数组的大小是输入,我们以2MB的步骤将输入从1MB变为40MB. 在我们的理解中,clflush应该在缓存中冲洗内容中的内容.因此,我们希望看到整个阵列的延迟首先要以阵列的大小线性增加,然后在阵列大小大于20MB之后,延迟应停止增加,这是我们程序的LLC的大小. 但是,实验结果令人惊讶,如图所示.阵列大小大于20MB后,延迟不会停止增加. 我们想知道,如果地址尚未在缓存中,则clflush是否可以在Clush将地址冲洗掉之前是否有可能带来地址? 我们还试图在英特尔软件开发人员手册中搜索,并且没有发现Clflush如果地址不在缓存中的任何解释. 以下是我们用来绘制图形的数据.第一列是kb中数组的大小,第二列是在几秒钟内冲洗整
20 2024-04-08
编程技术问答社区
为什么我的8M L3缓存对大于1M的阵列没有任何好处?
我受到这个问题的启发,编写一个简单的程序来测试我的机器的内存带宽在每个缓存级别: 为什么矢量化循环没有性能改进 我的代码使用memset一遍又一遍地写入缓冲区(或缓冲区)并测量速度.它还节省了每个缓冲区的地址,要在末尾打印.这是列表: #include #include #include #include #define SIZE_KB {8, 16, 24, 28, 32, 36, 40, 48, 64, 128, 256, 384, 512, 768, 1024, 1025, 2048, 4096, 8192, 16384, 200000} #define TESTMEM 10000000000 // Approximate, in bytes #define BUFFERS 1 double timer(void) { struct timeval ts;
14 2024-04-07
编程技术问答社区
使用while()和sleep()使程序进入睡眠模式的区别
我创建了一个共享对象,并从两个不同的程序中访问它并测量时间. 数据阵列是两个过程之间的共享对象. 案例1:在program 1 内使用时 program1: access shared DATA array ;// to load into memory and avoid page fault during access time calculation start=timer; access shared DATA array end=timer; Time_needed= end-start printf("Inside Program1, Time1=%d\n",Time_needed); start=timer; access shared DATA array end=timer; Time_needed= end-start printf("Inside Program1, Time2=%d\n",Time_needed);
12 2024-04-07
编程技术问答社区
在2个线程钉住不同的CPU之间传递一些变量的最佳方式
我有一个问题,我需要了解是否有更好的解决方案.我编写了以下代码将一些变量从作者线程传递给读取器线程.这些线程固定在不同的CPU上共享相同的L2高速缓存(禁用的超线程). writer_thread.h struct a_few_vars { uint32_t x1; uint32_t x2; uint64_t x3; uint64_t x4; } __attribute__((aligned(64))); volatile uint32_t head; struct a_few_vars xxx[UINT16_MAX] __attribute__((aligned(64))); reader_thread.h uint32_t tail; struct a_few_vars *p_xxx; 作者线增加了头变量,读取器线程检查头部变量和尾巴是否相等.如果它们不相等,则将读取新数据如下 while (true) {
10 2024-04-07
编程技术问答社区
pthread_create(3)和SMP架构下的内存同步保证
我正在研究问题, 7(IEEE STD 1003.1,2013 Edition),第4.11节文档,阐明了内存同步规则.这是我设法详细介绍POSIX/C内存模型的POSIX标准最具体的. 这是报价 4.11内存同步 应用程序应确保通过更多 一个控制线(线程或过程)的限制 没有控制线可以读取或修改内存位置时 控制的另一个线程可能正在修改它.这样的访问是 使用同步线程执行的函数限制,还限制 相对于其他线程同步内存.下列 功能相对于其他线程同步内存: fork()pthread_barrier_wait()pthread_cond_broadcast() pthread_cond_signal()pthread_cond_timedwait()pthread_cond_wait() pthread_create()pthread_join()pthread_mutex_lock() pthread_mutex_timedlock() pthread_mutex_t
10 2024-04-07
编程技术问答社区
如何选择块的大小?
我正在尝试学习循环优化.我发现循环瓷砖有助于使阵列循环更快.我尝试了下面有两个块的代码,并没有循环阻塞,并测量两者所花费的时间.我在大多数情况下都没有发现显着差异.我测试了改变块大小的改变,但我不确定如何选择块大小.如果我的方向错了,请帮助我.实际上,我发现没有块的循环多次工作速度更快. a.阻止 int max = 1000000; int B = 100; for (i = 0; i
10 2024-04-07
编程技术问答社区
如何在C语言中的两个程序之间共享库?
我想在C中的两个不同程序中使用相同的库函数(即OpenSSL库)进行计算.我如何确保两个程序都使用一个通用库,含义 将库的一个副本加载到共享的主内存 中,并且两个程序都从该内存位置访问库计算? 例如,当第一个程序访问库进行计算时,它将从主内存中加载到缓存中,当第二个程序希望以后访问它时,它将访问CACHE(已经由1st程序加载),再次从主内存中. 我在Linux下使用GCC.任何解释或指针都将不胜感激. 解决方案 代码不仅是由共享库,而且是同一二进制文件的可执行文件共享的,您不必做任何事情就能拥有此功能.它是系统内存管理的一部分. 数据将不会在两个过程之间共享.您将需要一个过程中的线程来共享数据.但是,除非您愿意,否则只需确保两个程序都使用完全相同的共享库文件(.SO文件).通常,您不必考虑这一点;只有两个程序使用图书馆的不同版本(当然不会共享). 请查看ldd /path/to/binary的输出,以查看二进制文件使用哪些共享库. 其他解决方案
12 2024-04-06
编程技术问答社区
实现高速缓存建模框架
我想建模在英特尔体系结构(LRU,包容性,K-Way Associative等)中的缓存行为.编程指南(第11章,但这不是很有帮助,因为它们只能解释在软件级别可以操纵的内容).我也阅读了一堆学术论文,但是像往常一样,即使在要求之后,它们也没有可用于复制.我的问题是,是否已经有一个公开可用的框架来建模缓存行为?如果没有,是否有文档详细介绍了最深层次的英特尔的缓存行为?我找不到一个. 解决方案 那里有很多缓存模拟器, 跟踪驱动,这意味着它在内存访问地址列表中输入,它不知道如何运行二进制.您可以通过使用二元仪器工具模拟它们来产生此类痕迹,例如 qemu 等.请注意,其中一些已经提供了内部缓存模拟器,并且可能可以玩. 其他模拟器可以模拟完整的CPU/系统行为,而不仅仅是缓存,因此可以支持运行二进制文件.其中大多数包括一个模拟的缓存系统.例如: gem5 和许多其他人 另一方面,编写自己的缓存模拟器非常简单 - 如果您可以在内存跟踪上工作(编写实际的fr
12 2024-04-06
编程技术问答社区