我需要关于如何继续和利用 CUDA 设备的计算能力来对函数进行数值积分的建议。关于我的设备的一些信息如下(不相关)
硬件
Geforce GTX470; Compute Capability 2.0
问题描述
我有一个像
g(x) = x * f(x, a, b, c)
我需要按照给定的方程进行积分
现在我已经编写了一个积分函数,它只需要 g(x),将区间分成N个子区间,计算各个子区间的结果,然后在 CPU 上进行汇总。为了完成目的,我在下面提供了一个代码示例。
__device__ float function(float x, float a, float b, float c) {
// do some complex calculation
return result;
}
__global__ void kernel(float *d_arr, float a, float b, float c, int N) {
int idx = blockIdx.x * blockDim.x + threadIdx.x;
float x = (float)idx / (float)N;
if (idx < N) {
d_arr[idx] = x * function(x, a, b, c);
}
}
上面的代码仅用于演示目的,我实际上使用 Romberg 方法来集成我的g(x),但想法是相同的。我真正的问题是因为我不只有一组值(a,b,c),我有这组的多个值。
我在设备内存中有一个二维数组,正好是 (3, 1024) 3 行,1024 列。每列代表一个需要执行集成功能的集合。
当我必须决定是否执行一个线程块(例如 1024)时,问题就来了,记住一个线程相当于一个集成函数。在这种情况下,我上面写的函数是没有用的。因为我想对所有的值集进行并行积分,所以我必须编写一个积分函数,它可以按顺序进行积分。举个例子:
__global__ void kernel(float *d_arr, float a, float b, float c, int N) {
int idx = blockIdx.x * blockDim.x + threadIdx.x;
float sum = 0;
for (int i = 0; i < N; i++) {
float x = (float)i / (float) N;
sum += x * function(x, a, b, c);
}
d_arr[idx] = sum;
}
所以你明白我的意思了吗?选项 A 似乎更好,但我不能使用它,因为我不知道如何进行多个积分,然后将每个积分分配给 N 个线程。
你会怎么做?你能建议我,我怎样才能实现多个积分,而每个积分都可以分布到 N 个线程?有没有更好的方法来做到这一点。
期待您的建议。