问题标签 [memory-access]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
356 浏览

kernel - 通用 OpenCL 模板内核和主机

我是 OpenCL 的新手。

我想编写一个通用内核,以便稍后我可以将其使用扩展到其他内存非合并模式并将其与Rectangular stencil pattern简单起见配对(也避免越界访问)。

该内核控制本地内存 ( __local float ∗lmem) 的使用。

截至目前,我的.cl文件结构如下:

有没有人对使用相应的通用主机实现这种模式有任何想法?

0 投票
0 回答
43 浏览

memory-management - 如何在方法调用中计算出对象成员的地址?

我知道这个问题有点笼统,但我已经需要一个通用的答案了。所以我想了解的是如何从内存的角度访问对象的成员变量,例如,当对该对象调用方法时?

例如,我有这个简单的课程;

运行时如何在hoo初始化之前找出它的内存地址?同样适用于以下代码;

运行时如何知道该字段的地址以在其上存储值?

IMO,至少对于 Java,这些变量地址被映射到类文件中的偏移量,因此可以通过将此偏移量添加到传递的对象引用(到虚拟方法中)来计算出确切的位置(在虚拟内存上)。但不确定...

有任何想法吗?

0 投票
1 回答
383 浏览

caching - 25% 内存指令的平均内存访问时间

*I-cache 的命中率为 0.95,命中率时间为 3 个周期,D-cache 的命中率为 0.85(3 个周期)。两者的未命中惩罚为 40 个周期。0.25 内存指令的 AMAT 是什么?

我成功计算出:AMAT_I = 3 + 0.05 * 40 = 5 AMAT_D = 3 + 0.15 * 40 = 9

解决方案告诉我:AMAT_Total = 1/1.25 * AMAT_I + 0.25/1.25 * AMAT_D 但我不明白为什么。有人可以解释一下它背后的逻辑吗?我想:AMAT_Total = 0.25 * (AMAT_I + AMAT_D)

0 投票
1 回答
1170 浏览

qt - Qt 信号槽 cv::Mat 无法读取内存访问冲突

我有一个 Microsoft Visual Studio 应用程序,它正在从相机中抓取帧,我正试图在 Qt 应用程序中显示这些帧。我正在使用 OpenCV 对帧进行一些处理,因此这些帧是 Mat 对象。我使用 QThreads 来并行化应用程序。当我尝试从我的 CameraThread 类发出 Mat 信号时,我得到一个访问冲突读取位置。

主文件

主窗口.cpp

camerawidget.cpp

相机线程.cpp

当我从 camerathread.cpp 发出 renderFrame 时,我得到一个访问冲突读取位置。我无法读取 camerawidget.cpp 中的 current_frame.ptr() 值。

有人可以指导我如何解决这个问题吗?

0 投票
4 回答
136 浏览

c++ - 读取数组的第一个元素还是第 4000 个元素更快?

从数组的第一个元素而不是第 4000 个元素读取时,速度是否有差异?数组中的任何其他元素也是如此。

主要是询问 c++,但任何语言都可以。

至于数组,它将是一个整数数组。

0 投票
5 回答
851 浏览

c++ - 如何优化此数组抽取/下采样程序的内存访问模式/缓存未命中?

我最近被问及一段代码来“就地”抽取/下采样数组。这个“抽取”函数接受一个整数数组,并将一个条目存储i在数组中索引处的偶数索引处i/2。它对数组中的所有条目执行此操作。

这会将原始数组中的所有偶数索引条目移动到数组的前半部分。然后可以将数组的其余部分初始化为 0。总体结果是一个数组,它保留了原始数组中的所有偶数索引条目(通过将它们移动到前半部分),而数组的后半部分为 0。这显然用于在信号处理中对信号进行下采样。

代码看起来像这样:

在提出将某些变量保留在寄存器中的基本改进建议后,我找不到任何进一步的优化方法,但不确定是否无法完成。

有没有办法可以优化循环中的内存访问模式以获得更好的缓存性能? 或者任何其他方法来优化将数组压缩/下采样到前半部分的主要复制操作?(例如,通过支持它的平台的矢量化)

是否有任何循环转换(例如平铺/条带挖掘)可以为这种抽取循环产生高效的代码?

编辑:下面的答案中建议了几种不同的方法,这些方法似乎利用 memset/fill 或指针算法来提高速度效率。这个问题主要关注是否有明确定义的循环转换可以显着改善局部性或缓存未命中(例如,如果它是具有两个循环的循环嵌套,则可能会考虑循环平铺以优化缓存未命中)

0 投票
1 回答
35 浏览

c - 在取消引用之前为未初始化的指针赋值

我发现了一个代码片段,其中声明了一个 char 指针(比如 *pData),而没有初始化为 NULL。

在调用函数 SomeFuntionToAssignValue() 后,取消引用 pData 是否可以在任何时间点引发“内存访问异常”错误?

因为在编译或本地测试期间(这里测试是在可以随时重新加载的目标中完成的,所以通常内存损坏的机会会减少)我们没有遇到任何“内存访问异常”错误。

但是在现场环境中进行测试时,至少有一周的时间没有重新加载目标,因此抛出了“内存访问异常”错误。

那么,不做有没有char *pData = NULL可能导致“内存访问异常”错误?

0 投票
0 回答
19 浏览

heap-memory - 分离全局/堆/堆栈访问

我正在 x86 平台上检测一个程序来收集它的内存引用。输出类似于 <instr address>,<read/write>,<data address>. 收集内存引用后,我需要在获得的输出中分离 Global/Heap/Stack 访问。通过程序的 objdump(.bss/.data 部分)的提示,我可以在一定程度上弄清楚程序的全局变量。但是我怎样才能知道给定的数据地址属于堆栈、堆还是由库定义的全局位置?

0 投票
1 回答
10050 浏览

x86 - 如何在现代 x86/amd64 芯片上关闭 L1、L2、L3 CPU 缓存?

x86/x86_64 架构的每个现代高性能 CPU 都有一些数据缓存层次结构:L1、L2,有时还有 L3(在极少数情况下是 L4),从主 RAM 加载/向主 RAM 加载的数据缓存在其中一些缓存中。

有时程序员可能希望某些数据不缓存在某些或所有缓存级别(例如,当想要 memset 16 GB 的 RAM 并将某些数据仍在缓存中时):有一些非临时 (NT) 指令用于这就像 MOVNTDQA ( https://stackoverflow.com/a/37092 http://lwn.net/Articles/255364/ )

但是是否有一种编程方式(对于某些 AMD 或 Intel CPU 系列,如 P3、P4、Core、Core i* ......)来完全(但暂时)关闭部分或所有级别的缓存,以更改每个内存的方式访问指令(全局或对于 RAM 的某些应用程序/区域)使用内存层次结构?例如:关闭L1,关闭L1和L2?或者将每个内存访问类型更改为“未缓存”UC(CR0 的 CD+NW 位??? SDM vol3a 第423 424、425页和“第三级缓存禁用标志, IA32_MISC_ENABLE MSR 的第 6 位(仅适用于基于Intel NetBurst 微架构)— 允许禁用和启用 L3 缓存,独立于 L1 和 L2 缓存。”)。

我认为这样的行动将有助于保护数据免受缓存侧通道攻击/泄漏,例如窃取 AES 密钥、隐蔽缓存通道、Meltdown/Spectre。尽管这种禁用将产生巨大的性能成本。

PS:我记得很多年前在某个技术新闻网站上发布过这样的程序,但现在找不到了。它只是一个 Windows exe,将一些神奇的值写入 MSR 并让每个 Windows 程序在它之后运行非常慢。缓存被关闭,直到重新启动或使用“撤消”选项启动程序。

0 投票
2 回答
4048 浏览

c++ - 内存访问冲突错误c ++

我正在尝试使用多个隐蔽渠道交换消息。所以,基本上,首先我需要选择我想用于通信的频道,然后选择我想与之聊天的用户的“destination_ip”,然后

进程消息()

叫做。现在,要从一个通道移动到另一个通道,我必须关闭现有连接,然后使用我要使用的新通道打开一个新连接。我下面的代码被修改为在关闭连接后继续使用相同的通道并且只包含你需要的东西。

请注意,我认为错误是由于

函数关闭()

因为没有它我不会得到任何错误。并且错误不会立即发生,而是在交换一些消息之后发生。这是错误:

未知位置(0):致命错误:在“communication/basic_communication”中:地址内存访问冲突:0x00000024:故障地址没有映射communicationTest.cpp(325):最后一个检查点:“basic_communication”测试条目