将简单的 C 代码转换为 CUDA 代码

标签 c cuda openmp numerical-methods

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

最佳答案

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

关于将简单的 C 代码转换为 CUDA 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3794798/

相关文章:

c - 如何在 C 中使用 main 的参数?

c - SSE2 SHA1 问题

cuda - 一个小小的 CUDA 难题

c++ - 为什么这个用于计算最长公共(public)子序列的并行函数比串行函数慢?

c++ - 如何在 OSX 上编译 caffe_rtpose?

将指针分配给函数时从不同大小警告的整数转换为指针

c - 在缓冲区中查找字符串

compiler-errors - 带置换迭代器的推力删除不起作用

ffmpeg - 如何将FFmpeg的AVPacket转入CUVID的CUVIDSOURCEDATAPACKET?或者如何使用 FFmpeg 的 CUVID,任何演示?

linux - 如何使用 OpenMP 标志将其作为并行处理?