- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 C 中实现了 Barnes-Hut 引力算法,如下所示:
第 2 阶段是最昂贵的阶段,因此通过划分恒星集并行实现。例如。有 1000 颗星和 2 个线程,我有一个线程处理前 500 个星,第二个线程处理后 500 个。
在实践中这是有效的:与非线程版本相比,它在双核机器上使用两个线程将计算速度提高了大约 30%。此外,它产生与原始非线程版本相同的数值结果。
我担心的是两个线程同时访问同一个资源(即树)。我没有向线程 worker 添加任何同步,因此它们很可能会在某个时候尝试从同一位置读取。尽管对树的访问是严格只读的,但我不能 100% 确定它是安全的。它在我测试时有效,但我知道这不能保证正确性!
问题
更新 好奇的基准测试结果:
机器:Intel Atom CPU N270 @ 1.60GHz,cpu MHz 800,缓存大小 512 KB
Threads real user sys
0 69.056 67.324 1.720
1 76.821 66.268 5.296
2 50.272 63.608 10.585
3 55.510 55.907 13.169
4 49.789 43.291 29.838
5 54.245 41.423 31.094
0 表示完全没有线程; 1 及以上意味着生成那么多工作线程并让主线程等待它们。我不期望超过 2 个线程的任何改进,因为它完全受 CPU 限制,这就是有多少个内核。有趣的是,奇数线程比偶数线程稍差。
查看 sys
很明显,创建线程是有成本的。目前它正在为每一帧创建线程(因此创建了 N*1000 个线程)。这很容易编程(在我今天早上在火车上的 15 分钟内)。我需要考虑一下如何重用线程...
更新#2 我让它使用线程池,与两个障碍同步。与每帧重新创建线程相比,这没有明显的性能优势。
最佳答案
您没有指定数据的结构,但通常同时从多个线程读取内存是安全的,并且不会引入任何性能问题。如果有人在写作,你只会遇到问题。
有趣的是,您说从两个线程中您只能获得 30% 的加速。如果你有一台空闲的机器,两个或更多的 CPU 和只读共享数据(即没有同步),我希望看到更接近 50% 的速度改进。这表明您的操作实际上完成得如此之快,以至于创建线程的开销在您的数字中变得越来越重要。您是否在超线程 CPU 上运行?
关于c - 只读内存访问的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2762803/
我在不同的硬件上测试 Cassandra 已经有一段时间了。 首先我有 2 个 CPU 和 6 GB RAM 然后我更改为 16 个 CPU 和 16 GB RAM(其中只有 6 GB 可供我的测试使
我只是想从二进制文件中读/写。我一直在关注 this教程,它的工作原理......除了它似乎正在将内容写入 txt 文件。我在测试的时候把文件命名为test.bin,但是记事本可以打开并正常显示,所以
我编写了一些简单的 Java 代码来从文本文件中读取字符串,将它们组合起来,然后将它们写回。 (有关输出没有变化的简化版本,请参见下面的片段) 问题是输入文件和输出文件中的特定字符(- 和 ...)是
我真的很感兴趣——你为什么要放 readln; 从键盘读取一些值到变量后的行?例如, repeat writeln('Make your choise'); read(CH); if (CH = '1
只要程序不允许同时写入存储在模块中的共享数据结构的相同元素,它是线程安全的吗?我知道这是一个菜鸟问题,但在任何地方都找不到明确解决的问题。情况如下: 在程序开始时,数据被初始化并存储在模块级可分配数组
我有一个数据结构,其操作可以归类为读取操作(例如查找)和写入操作(例如插入、删除)。这些操作应该同步,以便: 读操作不能在写操作执行时执行(除非在同一线程上),但是读操作可以与其他读操作并发执行。 在
我在Java套接字编程中有几个问题。 在读取客户端套接字中的输入流时,如果抛出IO异常;那么我们是否需要重新连接服务器套接字/再次初始化客户端套接字? 如果我们关闭输出流,它将关闭客户端套接字吗? 如
我正在尝试从客户端将结构写入带有套接字的服务器。 结构是: typedef struct R { int a; int b; double c; double d; double result[4];
我想知道是否可以通过 Javascript 从/向 Azure Active Directory 广告读取/写入数据。我读到 Azure 上有 REST 服务,但主要问题是生成与之通信的 token
我希望有人能提供完整的工作代码,允许在 Haskell 中执行以下操作: Read a very large sequence (more than 1 billion elements) of 32
我有一个任务是制作考试模拟器。我的意思是,在老师输入某些科目的分数后,学生输入他的名字、姓氏和出生,然后他决定学生是否通过科目。所以,我有一个问题,如何用新行写入文件文本并通过重写该文件来读取(逐行读
我需要编写巨大的文件(超过 100 万行)并将文件发送到另一台机器,我需要使用 Java BufferedReader 一次读取一行。 我使用的是 indetned Json 格式,但结果不太方便,
我在 Android 应用程序中有一个读写操作。在 onCreate 上,将读取文件并将其显示为编辑文本并且可以进行编辑。当按下保存按钮时,数据将被写入 onCreate 上读取的同一文件中。但我得到
我正在编写一个程序,该程序从一个文件读取输入,然后该程序将格式化数据并将其写入另一个文件。 输入文件: Christopher kardaras,10 N Brainard,Naperville,IL
我有一个 SCALA(+ JAVA) 代码,它以一定的速率读写。分析可以告诉我代码中每个方法的执行时间。如何衡量我的程序是否达到了最大效率?为了使我的代码优化,以便它以给定配置可能的最大速度读取。我知
嗨,我想知道如何访问 java/maven 中项目文件夹中的文件,我考虑过使用 src/main/resources,但有人告诉我,写入此目录中的文件是一个坏主意,并且应该只在项目的配置中使用,所以我
我想读\写一个具有以下结构的二进制文件: 该文件由“RECORDS”组成。每个“RECORD”具有以下结构:我将以第一条记录为例 (红色)起始字节:0x5A(始终为 1 字节,固定值 0x5A) (绿
我想制作一个C程序,它将用一些参数来调用;每个参数将代表一个文件名,我想在每个参数中写一些东西。 FILE * h0; h0 = fopen(argv[0],"w"); char buff
我有一个包含团队详细信息的文件。我需要代码来读取文件,并将获胜百分比写入第二个文件。我还需要使用指示的搜索功能来搜索团队的具体信息。该代码未写入百分比文件。当菜单显示时,第一个文件的内容被打印,但代码
我正在使用 read() 和 write() 函数来处理我的类,并且我正在尝试使用一个函数来写入它所读取的内容以及我作为参数给出的前面的内容。 例如,我想给出 10 作为我的程序的参数 int mai
我是一名优秀的程序员,十分优秀!