Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C memset可以在4个核上并行吗?_C_Windows_Multithreading_Winapi_Memory - Fatal编程技术网

C memset可以在4个核上并行吗?

C memset可以在4个核上并行吗?,c,windows,multithreading,winapi,memory,C,Windows,Multithreading,Winapi,Memory,我不敢肯定。我可以在四个核上写一个大的内存集(例如10MB)来获得加速吗 这样的ram芯片并行化有可能吗?启动其他线程的时间成本有多大?是大于毫秒还是小于毫秒?你指出了一个正确的问题,同时很难给出一个简单的答案。这涉及几个方面 启动新线程(或从某些缓存中拾取线程)的开销 内存总线上的上下文 上述方面各不相同,不同平台的成本也非常不同 更大的PC有几个内存总线。较小的只有一个。在单内存总线系统上,这没有任何意义。如果您的系统有多条内存总线(通道),那么您的数据阵列可能会在内存库之间进行任意分割。如

我不敢肯定。我可以在四个核上写一个大的内存集(例如10MB)来获得加速吗


这样的ram芯片并行化有可能吗?启动其他线程的时间成本有多大?是大于毫秒还是小于毫秒?

你指出了一个正确的问题,同时很难给出一个简单的答案。这涉及几个方面

  • 启动新线程(或从某些缓存中拾取线程)的开销
  • 内存总线上的上下文
  • 上述方面各不相同,不同平台的成本也非常不同
  • 更大的PC有几个内存总线。较小的只有一个。在单内存总线系统上,这没有任何意义。如果您的系统有多条内存总线(通道),那么您的数据阵列可能会在内存库之间进行任意分割。如果整个阵列都位于同一个内存库中,则并行化将毫无用处。计算阵列的布局又是一项开销。换句话说,在内核之间拆分操作之前,有必要弄清楚这是否值得做

    简单的回答是,这些难以预测的开销很可能会消耗收益,并使总体结果更糟


    同时,对于某些体系结构上的巨大内存区域来说,这是有意义的。

    如果您将其并行化,这样的操作可能只会变得更慢-您将有多个内核/CPU争夺对内存总线的访问权。也许使用特定指令一次移动更多字节会对您有所帮助。只有当数据分布在不同的内存部分时,使用并行化才有优势。并行
    memset
    可能更快的唯一情况是NUMA体系结构上有非常大的内存块,其中每个核心都在处理连接到其处理器的内存。@MarcB并且您需要“连接”线程,如果CPU之间的调度不是很统一,可能会浪费额外的时间。如果
    memset
    可以从您的体系结构上的这种设计中获益,您不是已经拥有了它吗?如果您不信任编写您的
    memset
    的人提供优化的实现,你不应该相信他们会做很多事情,因为这就像是库作者要确保做对的第一件事之一。是否值得在程序启动时确定是否值得将内存集并行化并在运行时决定?这可能应该在操作系统启动时发生。CPU对所有将要启动的应用程序都是相同的。另一方面,内存库之间的划分总是不同的,不容易评估。在现代CPU上,单个CPU内核在写入零时很容易使所有内存总线饱和。所以即使这样,并行化也没有意义。你能给出一些精确CPU的数字吗?比如从一个CPU核心发出内存命令的速度和内存控制器的速度?我很高兴看到这一点。