c++ - Mathematica/CUDA 减少执行时间

标签 c++ c cuda wolfram-mathematica montecarlo

我正在为粒子传输编写一个简单的蒙特卡洛模拟。我的方法是为 CUDA 编写内核并将其作为 Mathematica 函数执行。

内核:

#include "curand_kernel.h"
#include "math.h"

extern "C" __global__ void monteCarlo(Real_t *transmission, mint seed, mint pathN) {
curandState rngState;

int index = threadIdx.x + blockIdx.x*blockDim.x;

curand_init(seed, index, 0, &rngState);

if (index < pathN) {
    //-------------start one packet run----------------------

    float packetWeight = 1.0;
    int m = 0;

    while(packetWeight > 0.0){

        //MONTE CARLO CODE

        // Test: still in the sample?
            if(z_coordinate > sampleThickness){
                packetWeight = 0;
                z_coordinate = sampleThickness;
                transmission[index]=1;
            }
        }
    }
    //-------------end one packet run------------------------
}
}

数学代码:

Needs["CUDALink`"];
cudaBM = CUDAFunctionLoad[code, 
"monteCarlo", {{_Real, "Output"}, _Integer, _Integer}, 256, 
"UnmangleCode" -> False];


pathN = 100000;
result = 0;  (*count for transmitted particles*)
For[j = 0, j < 10, j++,
   buffer = CUDAMemoryAllocate["Float", 100000];
   cudaBM[buffer, 1490, pathN];
   resultOneRun = Total[CUDAMemoryGet[buffer]];
   result = result + resultOneRun;
];

目前看来一切正常,但与没有 CUDA 的纯 C 代码相比,速度提升微乎其微。我有两个问题:

  1. curand_init() 函数在每个求和步骤开始时由所有线程执行 -> 我可以为所有线程调用一次该函数吗?
  2. 内核向 Mathematica 返回一个非常大的实数数组 (100 000)。我知道,CUDA 的瓶颈是 GPU 和 CPU 之间的 channel 带宽。我只需要列表所有元素的总和,所以在 GPU 中计算列表元素的总和并只向 CPU 发送一个实数会更高效。

最佳答案

1) 如果您需要为所有线程执行一次 curand_init(),您可以只在 CPU 中执行此操作并将其作为参数传递给 CUDA 吗?

2) 求和并返回值的“device float sumTotal”函数怎么样?您是否已将尽可能多的*传输数据复制到共享内存缓冲区中?

关于c++ - Mathematica/CUDA 减少执行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14236478/

相关文章:

CUDAatomicAdd() 给出了错误的结果

c++ - 在 cuda __device__ 函数中分配 (malloc) double**

c++ - 如何使用 C/C++ 编写/创建大于 2GB 的文件

c++ - 检查类型是否为 map

c++ - 初始化 vector 的高效而优雅的方法

c - 在 C 中将 * 与字符串指针一起使用

c - 如何以编程方式打开默认浏览器并在 C/Linux 中传递 URL?

c - Visual Studio 2017 跨平台中特定于 Linux 的 header

C++/CUDA : Calculating maximum gridSize and blockSize dynamically

c++ - undefined reference - 为什么链接时找不到头文件中的某些方法?