2010-09-25 87 views
2

我试图将一个简单的数值分析代码(梯形规则数值积分)转换成将在启用CUDA的GPU上运行的代码。这里有很多文献,但它似乎远比这里要求的复杂得多!我目前的代码是:将简单的C代码转换为CUDA代码

#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

对于每个不知道梯形规则数值积分是什么的人来说,它是梯形法则。 – 2010-09-25 17:42:29

+0

六和两三? – JMzance 2010-09-25 21:00:12

+0

我们可以看到OpenMP代码吗?它可能更容易转换 – 2010-11-27 07:36:41

回答

0

你可以摆脱乘法:d

double nomul = h; 
    for (i = 1; i < N; ++i) { 
     ans += function(nomul); 
     nomul += h; 
    } 
+0

在我看来,如果你打算进行并行计算,这是行不通的。 – Wok 2010-09-25 17:44:51

+0

因为你需要我是一个私人变量的权利? – JMzance 2010-09-25 18:12:47

-2

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

如果你正在寻找的东西票友,你可以尝试编译this project(你需要安装OpenCV),其中图像转换到其灰度表现(有文件汇编关于的Windows/Linux的/的Mac OS X,所以如果你需要帮助来编译你的项目,那么值得一看)。

1

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