C ++使用多核中断输出,数学问题的代码
C ++ using multiple cores breakes output , code for a math problem
所以,我刚开始学习 C++,我必须解决这个问题:找到合适的数字:5 * 5 = 25 , 25 * 25 =625(25squared), 6*6 = 36(6squared)(25 是 625 的尾数,5 是 25 的尾数)。所以我有我的代码来找到所有低于 30k 的数字,但后来我想把它推到极限,所以达到 lluint_max,但它真的很慢,我看到我的 12 核 cpu 未使用,所以我想我会添加更多 cpu 核心。我想找到最简单的修复方法,我找到了 openmp,读了一点,发现如果我为它添加 omp 应该将负载分配给多个内核,但控制台不再显示我的数字。(PS 我在 vs 中启用 omp)
这是我的代码:
#include <iostream>
#include <cmath>
#include <climits>
#include <omp.h>
using namespace std;
int main()
{
long long int x, i, nc = 0, z = 1, p;
#pragma omp for
for (x = 1; x <= ULLONG_MAX; x++)
{
//numarul de cifre a lui x
while (x / z != 0)
{
z = z * 10;
nc = nc + 1;
}
//patratul
p = x * x;
i = pow(10, nc);
if (p % i == x)
cout << x << endl;
}
}
这是我的输出:
C:\Users\Mihai Cazac\source\repos\ConsoleAPP2\Debug\ConsoleAPP2.exe (process 8736) exited with code 0.
To automatically close the console when debugging stops, enable Tools->Options->Debugging->Automatically close the console when debugging stops.
Press any key to close this window . . .
预期输出:
1
5
6
25
76
376
625
9376
90625
109376
890625
2890625
7109376
12890625
//and so on
提前致谢!!
所以我已经解决了,特别感谢 Raymond Chen 的评论和他指导我访问的博客,http://supercomputingblog.com/openmp/tutorial-parallel-for-loops-with-openmp/
这个网站解释得很好。
我尽可能晚地声明变量,也更改为 LLInt_Max 因为 openmp 不想只使用无符号的,idk 为什么
动态调度似乎也分担了工作量,但我可能是错的。
我的最终代码:
#include <iostream>
#include <cmath>
#include <climits>
#include <omp.h>
using namespace std;
int main()
{
#pragma omp parallel for schedule(dynamic)
for (long long int x = 1; x < LLONG_MAX; x++)
{
long long int t = x;
int d = 0;
while (t > 0)
{
t = t / 10;
d++;
}
//patratul
long long int p = x * x;
long long int i = pow(10, d );
if (p % i == x)
cout << x << endl;
}
}
所以,我刚开始学习 C++,我必须解决这个问题:找到合适的数字:5 * 5 = 25 , 25 * 25 =625(25squared), 6*6 = 36(6squared)(25 是 625 的尾数,5 是 25 的尾数)。所以我有我的代码来找到所有低于 30k 的数字,但后来我想把它推到极限,所以达到 lluint_max,但它真的很慢,我看到我的 12 核 cpu 未使用,所以我想我会添加更多 cpu 核心。我想找到最简单的修复方法,我找到了 openmp,读了一点,发现如果我为它添加 omp 应该将负载分配给多个内核,但控制台不再显示我的数字。(PS 我在 vs 中启用 omp)
这是我的代码:
#include <iostream>
#include <cmath>
#include <climits>
#include <omp.h>
using namespace std;
int main()
{
long long int x, i, nc = 0, z = 1, p;
#pragma omp for
for (x = 1; x <= ULLONG_MAX; x++)
{
//numarul de cifre a lui x
while (x / z != 0)
{
z = z * 10;
nc = nc + 1;
}
//patratul
p = x * x;
i = pow(10, nc);
if (p % i == x)
cout << x << endl;
}
}
这是我的输出:
C:\Users\Mihai Cazac\source\repos\ConsoleAPP2\Debug\ConsoleAPP2.exe (process 8736) exited with code 0.
To automatically close the console when debugging stops, enable Tools->Options->Debugging->Automatically close the console when debugging stops.
Press any key to close this window . . .
预期输出:
1
5
6
25
76
376
625
9376
90625
109376
890625
2890625
7109376
12890625
//and so on
提前致谢!!
所以我已经解决了,特别感谢 Raymond Chen 的评论和他指导我访问的博客,http://supercomputingblog.com/openmp/tutorial-parallel-for-loops-with-openmp/
这个网站解释得很好。 我尽可能晚地声明变量,也更改为 LLInt_Max 因为 openmp 不想只使用无符号的,idk 为什么 动态调度似乎也分担了工作量,但我可能是错的。
我的最终代码:
#include <iostream>
#include <cmath>
#include <climits>
#include <omp.h>
using namespace std;
int main()
{
#pragma omp parallel for schedule(dynamic)
for (long long int x = 1; x < LLONG_MAX; x++)
{
long long int t = x;
int d = 0;
while (t > 0)
{
t = t / 10;
d++;
}
//patratul
long long int p = x * x;
long long int i = pow(10, d );
if (p % i == x)
cout << x << endl;
}
}