memory-access相关内容

变量只由一个线程读取,由另一个线程读取和写入,需要同步吗?

动机: 我只是在学习多线程的基础知识,还没有接近完成它们,但我想在我的学习之旅的早期问一个问题,以指导我进入与我正在从事的项目最相关的主题。 Main: a.如果一个进程有两个线程,一个线程编辑一组变量,另一个线程只读取这些变量,而不编辑它们的值;那么我们是否需要任何形式的同步来保证读取线程读取的值的有效性? B.调度这两个线程的操作系统是否可能导致读线程在写线程向同一内存位置 ..
发布时间:2022-06-16 20:00:28 其他开发

在 CUDA 中,什么是内存合并,它是如何实现的?

什么是 CUDA 全局内存事务中的“合并"?即使通过我的 CUDA 指南,我也无法理解.怎么做?在 CUDA 编程指南矩阵示例中,逐行访问矩阵称为“合并"或 col.. by col.. 称为合并?哪个是正确的,为什么? 解决方案 此信息可能仅适用于计算能力 1.x 或 cuda 2.0.更新的架构和 cuda 3.0 具有更复杂的全局内存访问,实际上甚至没有为这些芯片配置“合并的全局负载 ..
发布时间:2022-01-10 15:18:21 其他开发

如果两个线程读取 & 会发生什么?写同一块内存

我的理解是,如果两个线程正在从同一块内存中读取数据,并且没有线程正在写入该内存,则该操作是安全的.但是,我不确定如果一个线程正在读取而另一个线程正在写入会发生什么.会发生什么?结果是不确定的吗?或者阅读只是陈旧的?如果过时的读取不是问题,是否可以对变量进行不同步的读写?或者有没有可能是数据被破坏了,读取和写入都不正确,在这种情况下应该始终同步? 我想说的是,我已经了解到这是后一种情况,内存访 ..
发布时间:2021-12-28 23:05:45 其他开发

我可以在 GDB 中的“内存访问"上设置断点吗?

我正在通过 gdb 运行一个应用程序,我想在任何时候访问/更改特定变量时设置断点.有没有好的方法可以做到这一点?我也对在 C/C++ 中监视变量的其他方法感兴趣,以查看它是否/何时发生变化. 解决方案 watch 只在写入时中断,rwatch 让你在读取时中断,awatch 让你中断读/写. 您可以在内存位置上设置读取观察点: gdb$ rwatch *0xfeedface硬件读取 ..
发布时间:2021-12-14 08:08:23 C/C++开发

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

我有一个 Microsoft Visual Studio 应用程序,它从相机中抓取帧,我正尝试在 Qt 应用程序中显示这些帧.我正在使用 OpenCV 对帧进行一些处理,因此帧是 Mat 对象.我使用 QThreads 来并行化应用程序.当我尝试从我的 CameraThread 类发出 Mat 信号时,我收到了访问冲突读取位置. main.cpp int main(int argc, ch ..
发布时间:2021-11-26 20:06:44 其他开发

在 64 位指针中使用额外的 16 位

我读到 64 位机器实际上只使用 48 位地址(具体来说,我使用的是 Intel核心 i7). 我希望额外的 16 位(位 48-63)与地址无关,并且会被忽略.但是当我尝试访问这样的地址时,我得到了一个信号 EXC_BAD_ACCESS. 我的代码是: int *p1 = &val;int *p2 = (int *)((long)p1 | 1ll ..
发布时间:2021-11-25 04:57:03 C#

效率:数组与指针

据说通过指针访问内存比通过数组访问内存更有效.我正在学习 C,以上内容在 K&R 中有说明.他们具体说 任何可以通过数组下标实现的操作,也可以用指针来完成.指针版本一般会更快 我使用 Visual C++ 反汇编了以下代码.(我的是 686 处理器.我已禁用所有优化.) int a[10], *p = a, temp;空 foo(){温度 = a[0];温度 = * p;} 令我惊 ..
发布时间:2021-11-18 01:51:34 其他开发

从非合并访问到合并内存访问CUDA

我想知道是否有任何简单的方法可以将非分组内存访问转换为合并内存访问.让我们以这个数组为例: dW [[w0,w1,w2] [w3,w4,w5] [w6,w7] [w8,w9]] 现在,我知道,如果块0中的线程0访问 dW [0] ,然后块0中的线程1访问 dw [1] ,那就是合并访问在全局内存中.问题是我有两次手术.如上所述,第一个被合并.但是第二个不是因为块0中的线程1需要对 dW [ ..
发布时间:2021-04-27 20:12:10 C/C++开发

多次访问主存储器和无序执行

让我们假设我有两个指针指向未缓存的无关地址,因此在被取消引用时,它们都必须从主内存中移出。 int load_and_add(int * pA,int * pB) { int a = * pA; //最有可能错过高速缓存 int b = * pB; //很有可能会在高速缓存中丢失 // ...某些未使用a或b的代码 int c = a + b; 返回c; } ..
发布时间:2020-10-11 00:04:01 其他开发

如果两个线程读取&写相同的内存

据我了解,如果两个线程正在从同一块内存中读取,并且没有线程正在对该内存进行写操作,则该操作是安全的。但是,我不确定一个线程正在读取而另一个线程正在写入时会发生什么。会发生什么?结果不确定吗?还是阅读会陈旧?如果不必担心过时的读取,可以对变量进行不同步的读写吗?还是有可能数据被破坏了,读和写都不正确,在这种情况下应该始终同步? 我想说我我已经知道是后一种情况,关于内存访问的竞赛使状态处于未定义 ..
发布时间:2020-10-07 20:30:22 其他开发

在CUDA中,什么是内存合并,如何实现?

什么是CUDA全局内存事务中的“合并"?即使阅读了CUDA指南,我也听不懂.怎么做?在CUDA编程指南矩阵示例中,逐行访问矩阵称为"coalesced"或col .. by col ..称为结盟? 哪个是正确的,为什么? 解决方案 该信息可能仅适用于计算能力1.x或cuda 2.0.较新的体系结构和cuda 3.0具有更复杂的全局内存访问,实际上,这些芯片甚至都没有分析“成组的全局负载". ..
发布时间:2020-07-21 18:45:21 其他开发

提供对AoS的AoS访问

我将数据以数组结构(SoA)或指针结构(SoP)的形式布置在内存中,并且有一种访问该数据的方式,就好像它是以结构数组(AoS)的形式布置一样- -下面给出的代码. 但是,我对使用struct AoS_4_SoP不太满意-尽管此struct似乎使用模板,但它并不是通用的,因为例如foo和bar在内部进行了硬编码它. 两个问题/要求: 1)为了实现读写性能,AoS访问是否与直接SoA ..

在64位指针中使用额外的16位

我读到一台64位计算机实际上仅使用48位地址(具体来说,我使用的是Intel核心i7). 我希望多余的16位(位48-63)与该地址无关,因此将被忽略.但是当我尝试访问这样的地址时,我收到了信号EXC_BAD_ACCESS. 我的代码是: int *p1 = &val; int *p2 = (int *)((long)p1 | 1ll ..
发布时间:2020-05-28 21:15:49 其他开发

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

我有一个Microsoft Visual Studio应用程序,该应用程序正在从相机中抓取帧,我正在尝试在Qt应用程序中显示这些帧.我正在使用OpenCV对框架进行一些处理,因此框架是Mat对象.我使用QThreads来并行化应用程序.尝试从CameraThread类发出Mat信号时,出现读取访问冲突的地方. main.cpp int main(int argc, char *argv ..
发布时间:2020-05-20 19:42:40 其他开发

对象和结构成员访问和地址偏移量计算

我正在编写一个简单的VM,并且对实现对象和结构成员访问有疑问. 由于程序的开始地址在每次运行时都是任意的,因此随后每个程序对象的地址也是任意的. 因此,我想到访问对象或其成员对象的唯一方法是访问“基本"指针的偏移量,这意味着需要进行算术运算才能访问程序结构中的任何内容. 我的问题是,这是否是在专业编译器中完成的方式,因为显然,这种方法增加了运行时的开销,而且由于缺乏这种方法,我本 ..
发布时间:2020-05-08 01:53:25 其他开发