gpt4 book ai didi

c++ - 为大量迭代优化代码

转载 作者:太空狗 更新时间:2023-10-29 23:53:19 26 4
gpt4 key购买 nike

我目前正在从事一个涉及大量迭代(准确地说是 2^32)的项目。我主要使用 Mathematica 进行大部分计算,但它无法处理那么多的进程。有人向我建议c++可以处理它,所以昨晚我学习了c++并编写了以下代码:

//old code  

代码运行良好,(我检查了较小的参数)但我已经开始运行它 4294967295 = 2^32-1 步,我认为这将花费数百小时。如果有人能告诉我是否有办法优化这段代码以便它运行得更快,我将不胜感激?我没有使用过这种语言的经验,所以我构建这些函数的方式可能看起来很困惑。我认为我的 Ca2step 函数运行得非常高效(我可能错了),而且我认为主要部分中的循环正在减慢一切。我认为必须有更快的方法来完成我想要完成的事情,所以任何帮助都会很棒。谢谢,理查德。

=======更新========

非常感谢大家,我真的很感激。好的,这对我来说都是全新的,所以我发现很难理解某些事情的含义。下面是我更新的代码。但是我觉得它仍然很慢。有人建议“并行化”,但我不知道这是什么以及我将如何做?再次感谢,理查德。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

//parameters
int a[32] = {0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0,
1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1};
int b[32] = {1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1,
1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1};
// Create vector of vectors from arrays to be input into function.
vector<int> va (a, a + sizeof(a) / sizeof(int) );
vector<int> vb (b, b + sizeof(b) / sizeof(int) );

vector< vector<int> > ca2step (long int r, vector< vector<int> > vec)
{
int rulearray[32] = { 0 };
for (int pos = 31; pos >= 0; --pos){
if (r % 2)
rulearray[pos] = 1;
r /= 2;
}
int arraya[32] = {0};
int arrayb[32] = {0};
for (int i = 0; i < 32; i++) {
arraya[i] = vec[0][i];
arrayb[i] = vec[1][i];
}

vector< vector<int> > output;
typedef int t_array[32];
t_array vll, vl, vr, vrr, vx;

rotate_copy(arrayb,arrayb+2,arrayb+32,vll);
rotate_copy(arrayb,arrayb+1,arrayb+32,vl);
rotate_copy(arrayb,arrayb+31,arrayb+32,vr);
rotate_copy(arrayb,arrayb+30,arrayb+32,vrr);


for (int i = 0; i < 32; i++) {
vx[i] = (arraya[i] + rulearray[(31 - (vll[i] + (2 * vl[i])
+ (4 * arrayb[i]) + (8 * vr[i]) + (16 * vrr[i])))]) % 2;
}

output.push_back(vector<int>(arrayb, arrayb+32));
output.push_back(vector<int>(vx, vx+32));

return (output);

}

int caevolve ( long int r, vector< vector<int> > vector ){
int count;
for(int j=0; j<20; j++){
//run function
vector = ca2step(r, vector);
}
if (vector[0] == va || vector[1] == va) {
count = 1;
}
else{
count=0;
}
return (count);
}

int main ()
{
vector< vector<int> > vinput;
vinput.reserve(32);
vinput.push_back(va);
vinput.push_back(vb);
int counter = 0;

for(unsigned long long int i=0;i<4294967295;i++){ //4294967295
counter += caevolve(i, vinput);
}

cout<< "Counter : " << counter << endl;

return 0;

}

最佳答案

除了 C++ 性能之外,您还应该考虑并行化代码并利用多核架构。在我看来,您的问题是执行此操作的经典示例。

关于c++ - 为大量迭代优化代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11583292/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com