【发布时间】:2016-12-28 07:47:38
【问题描述】:
我想加快这个嵌套的for循环,刚开始学习CUDA,我如何使用CUDA来并行这个c++代码?
#define PI 3.14159265
using namespace std;
int main()
{
int nbint = 2;
int hits = 20;
int nbinp = 2;
float _theta, _phi, _l, _m, _n, _k = 0, delta = 5;
float x[20],y[20],z[20],a[20],t[20];
for (int i = 0; i < hits; ++i)
{
x[i] = rand() / (float)(RAND_MAX / 100);
}
for (int i = 0; i < hits; ++i)
{
y[i] = rand() / (float)(RAND_MAX / 100);
}
for (int i = 0; i < hits; ++i)
{
z[i] = rand() / (float)(RAND_MAX / 100);
}
for (int i = 0; i < hits; ++i)
{
a[i] = rand() / (float)(RAND_MAX / 100);
}
float maxforall = 1e-6;
float theta0;
float phi0;
for (int i = 0; i < nbint; i++)
{
_theta = (0.5 + i)*delta;
for (int j = 0; j < nbinp; j++)
{
_phi = (0.5 + j)*delta / _theta;
_l = sin(_theta* PI / 180.0)*cos(_phi* PI / 180.0);
_m = sin(_theta* PI / 180.0)*sin(_phi* PI / 180.0);
_n = cos(_theta* PI / 180.0);
for (int k = 0; k < hits; k++)
{
_k = -(_l*x[k] + _m*y[k] + _n*z[k]);
t[k] = a[k] - _k;
}
qsort(t, 0, hits - 1);
float max = t[0];
for (int k = 0; k < hits; k++)
{
if (max < t[k])
max = t[k];
}
if (max > maxforall)
{
maxforall = max;
}
}
}
return 0;
}
我想将最里面的 for 循环和排序部分(可能是整个嵌套循环)并行化。对这些数组进行排序后,我找到了所有数组的最大值。我使用最大值来简化代码。我需要排序的原因是最大代表 这是一个连续的时间信息(所有数组都包含时间信息)。排序部分使这些时间从最低到最高。然后我比较特定的时间间隔(不是单个值)。比较过程几乎就像我选择最大值但连续间隔不是单个值。
【问题讨论】:
-
你在这里计算什么?
nbint、nbinp和hits有多大?请发布minimal reproducible example,包括输入数据的小数字样本以及所需的输出。 -
首先我要计算数组t[k],然后对这个数组进行排序。我想要的输出是 nbint*nbinp 排序数组。
-
您想要
20*2=40数组还是带有40元素的单个数组?为什么在循环内进行排序?该算法对我来说仍然不清楚 -
请使用您在 cmets 中提供的所有信息更新您的问题,还请描述您在收到排序数组后执行的后处理,因为这也可能非常可并行化(一个小的数字示例将也有帮助)
-
所以算法的结果是单个标量(
maxforall)?如果只想确定最大值,为什么还要对数组进行排序?
标签: c++ parallel-processing cuda gpu