我正在尝试将简单的数值分析代码(梯形规则数值积分)转换为可在我的支持CUDA的GPU上运行的代码。那里有很多文献,但这看起来要比这里要求的要复杂得多!我目前的代码是:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define N 1000
double function(double);
int main(void)
{
int i;
double lower_bound, upper_bound, h, ans;
printf("Please enter the lower and upper bounds: ");
scanf(" %lf %lf", &lower_bound, &upper_bound);
h = (upper - lower) / N;
ans = (function(lower) + function(upper)) / 2.0;
for (i = 1; i < N; ++i) {
ans += function(i * h);
}
printf("The integral is: %.20lf\n", h * ans));
return 0;
}
double function(double x)
{
return sin(x);
}
这很好地运行直到N变得非常大。我用openMP实现了一个更快的实现,但我认为对CUDA也有一点了解也很方便。有没有人有任何关于从哪里开始的建议或者是否有一种无痛的方式来转换这段代码?非常感谢,杰克。
答案 0 :(得分:1)
这是必须分配给并行线程的循环。您可以为每个线程计算唯一索引(idx = 0 ... N-1)。每个线程仅计算其积分的各个部分,并将答案存储在公共数组(intgrl [idx])中的位置。然后使用称为并行扫描或聚集的过程对所有内容求和。 NVIDIA cuda示例中有一些示例。最简单的方法是使用Thrust库。您只需告诉它“添加这些值”,它就会计算出最快的方法。
答案 1 :(得分:0)
你可以摆脱乘法:D
double nomul = h;
for (i = 1; i < N; ++i) {
ans += function(nomul);
nomul += h;
}
答案 2 :(得分:-2)
首先,继续在您的计算机上安装CUDA。之后,尝试运行SDK上提供的一些示例。它们看起来有点复杂,但不要担心,网上有大量的CUDA“Hello World”示例。
如果你正在寻找更漂亮的东西,你可以尝试编译this project(你需要安装OpenCV),它将图像转换为灰度表示(它有要在 Windows上编译的文件) / Linux / Mac OS X ,所以如果您需要帮助来编译项目,那么值得一看。