Linux 根据操作系统的不同,在一个内核上运行多个线程,而不是四个

Linux 根据操作系统的不同,在一个内核上运行多个线程,而不是四个,linux,windows,raspbian,raspberry-pi3,Linux,Windows,Raspbian,Raspberry Pi3,我在《覆盆子3》中使用覆盆子 我需要将代码分成几个块(2或4),并为每个块分配一个线程,以加快计算速度 目前,我正在测试一个线程上的简单循环(见附件代码),然后在4个线程上进行测试。4个线程上的执行时间总是长4倍,所以这4个线程似乎被安排在同一个CPU上运行 如何分配每个线程在其他CPU上运行?即使两个CPU上有两个线程,对我来说也会有很大的不同 我甚至尝试使用g++6,但没有任何改进。并在代码中使用并行libs openmp,其中“#pragma omp for”仍在一个CPU上运行 我尝试在

我在《覆盆子3》中使用覆盆子

我需要将代码分成几个块(2或4),并为每个块分配一个线程,以加快计算速度

目前,我正在测试一个线程上的简单循环(见附件代码),然后在4个线程上进行测试。4个线程上的执行时间总是长4倍,所以这4个线程似乎被安排在同一个CPU上运行

如何分配每个线程在其他CPU上运行?即使两个CPU上有两个线程,对我来说也会有很大的不同

我甚至尝试使用g++6,但没有任何改进。并在代码中使用并行libs openmp,其中“#pragma omp for”仍在一个CPU上运行

我尝试在Fedora Linux x86上运行此代码,但在Windows 8.1和VS2015上,我得到了不同的结果,时间是相同的,一个线程,然后是4个线程,因此它在不同的CPU上运行

你有什么建议吗

多谢各位

#include <iostream>
//#include <arm_neon.h>
#include <ctime>
#include <thread>
#include <mutex>
#include <iostream>
#include <vector>
using namespace std;

float simd_dot0() {

unsigned int i;
unsigned long rezult;
   for (i = 0; i < 0xfffffff; i++) {
    rezult = i;
   }
 return rezult;
 }

 int main() {

 unsigned num_cpus = std::thread::hardware_concurrency();

 std::mutex iomutex;
 std::vector<std::thread> threads(num_cpus);
 cout << "Start Test 1 CPU" << endl; // prints !!!Hello World!!!
 double t_start, t_end, scan_time;
 scan_time  = 0;
 t_start = clock();
 simd_dot0();
 t_end = clock();
 scan_time += t_end - t_start;
 std::cout << "\nExecution time on 1 CPU: "
   << 1000.0 * scan_time / CLOCKS_PER_SEC << "ms" << std::endl;
 cout << "Finish Test on 1 CPU" << endl; // prints !!!Hello World!!!
 cout << "Start Test 4 CPU" << endl; // prints !!!Hello World!!!
 scan_time  = 0;
 t_start = clock();
 for (unsigned i = 0; i < 4; ++i) {
   threads[i] = std::thread([&iomutex, i] {
     {
       simd_dot0();
                std::cout << "\nExecution time on CPU: "
                          << i << std::endl;

     }

     // Simulate important work done by the tread by sleeping for a bit...

   });
 }

 for (auto& t : threads) {
   t.join();
 }

 t_end = clock();
 scan_time += t_end - t_start;
 std::cout << "\nExecution time on 4 CPUs: "
      << 1000.0 * scan_time / CLOCKS_PER_SEC << "ms" << std::endl;
 cout << "Finish Test on 4 CPU" << endl; // prints !!!Hello World!!!
 cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
 while (1);
 return 0;
}

你能指定你已经传递给gcc(及其版本)的标志吗?在Raspberry Pi3 Raspbian上,我使用了g++4.9和6以及“-std=c++11-ftree vectorize-Wl,--no-as-needed-lpthread-march=armv8-a+crc-mcpu=cortex-a53-mfpu=neon-fp-armv8-funsafe数学优化-O3”
-std=c++11 -ftree-vectorize -Wl--no-as-needed -lpthread -march=armv8-a+crc -mcpu=cortex-a53 -mfpu=neon-fp-armv8 -funsafe-math-optimizations -O3