2

我正在尝试将一个简单的数值分析代码(梯形规则数值积分)转换为可以在启用了 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 也会很方便。有没有人对从哪里开始或是否有一种无痛的方法来转换此代码有任何建议?非常感谢,杰克。

4

3 回答 3

1

这是必须分配给并行线程的循环。您可以计算每个线程的唯一索引 (idx = 0...N-1)。每个线程仅计算其积分的单独部分并将答案存储在公共数组(intgrl[idx])中的位置。然后,您使用称为并行扫描或收集的过程对所有内容进行总结。NVIDIA cuda 示例中有示例。最简单的方法是使用 Thrust 库。您只需告诉它“将这些值相加”,它就会计算出最快的方法。

于 2011-01-26T08:23:56.267 回答
0

你可以摆脱乘法:D

   double nomul = h;
   for (i = 1; i < N; ++i) {
      ans += function(nomul);
      nomul += h;
   }
于 2010-09-25T17:43:12.940 回答
-2

首先,继续在您的计算机上安装 CUDA。之后,尝试运行 SDK 上提供的一些示例。乍一看它们可能看起来有点复杂,但不用担心,网络上有大量的 CUDA “Hello World”示例。

如果你正在寻找更高级的东西,你可以尝试编译这个项目(你需要安装 OpenCV),它将图像转换为其灰度表示(它有文件要在Windows/Linux/Mac OS X上编译,所以它如果您需要帮助来编译您的项目,值得一看)。

于 2010-09-25T17:53:36.737 回答