循环访问 CUDA 中的三维数组以对它们的元素求和
Looping over 3 dimensional arrays in CUDA to sum their elements
我在理解如何使用内核遍历三维数组时遇到了一些问题。
这是我到目前为止的代码:
#include <iostream>
#include <ctime>
#include <cuda.h>
#include <cuda_runtime.h>
#include <device_launch_parameters.h>
using namespace std;
int main()
{
// Array properties
const int width = 1;
const int height = 1;
const int depth = 1;
// Declaration of arrays
float h_A[width][height][depth];
float h_B[width][height][depth];
float h_C[width][height][depth] = {{{0}}};
// Fill up arrays
srand(time(0));
for(int i = 0; i < width; i++){
for(int j = 0; j < height; j++){
for(int z = 0; z < depth; z++){
h_A[i][j][z] = rand()%1000;
h_B[i][j][z] = rand()%1000;
}
}
}
// Declaration of device pointers
cudaPitchedPtr d_A, d_B, d_C;
// Allocating memory in GPU
cudaExtent extent = make_cudaExtent(width*sizeof(float),height,depth);
cudaMalloc3D(&d_A, extent);
cudaMalloc3D(&d_B, extent);
cudaMalloc3D(&d_C, extent);
// Copying memory from host to device
cudaMemcpy3DParms p;
p.srcPtr = make_cudaPitchedPtr(&h_A, sizeof(float)*width, height, depth);
p.extent = extent;
p.kind = cudaMemcpyHostToDevice;
p.dstPtr = d_A;
cudaMemcpy3D(&p);
p.dstPtr = d_B;
cudaMemcpy3D(&p);
p.dstPtr = d_C;
cudaMemcpy3D(&p);
system("pause");
return 0;
}
如何制作一个循环遍历数组中每个元素并将它们相加的内核?
CUDA 4.0 编程指南第 21 页上有一个示例,用于循环 2D 浮点数数组:
// Host code
int width = 64, height = 64;
float* devPtr;
size_t pitch;
cudaMallocPitch(&devPtr, &pitch,
width * sizeof(float), height);
MyKernel<<<100, 512>>>(devPtr, pitch, width, height);
// Device code
__global__ void MyKernel(float* devPtr, size_t pitch, int width, int height)
{
for (int r = 0; r < height; ++r)
{
float* row = (float*)((char*)devPtr + r * pitch);
for (int c = 0; c < width; ++c)
{
float element = row[c];
}
}
}
重写它以总结元素应该很容易。此外,您可以参考此线程。当考虑效率时,您还可以查看 CUDA 中的并行减少方法。例如,在实现蒙特卡罗模拟时会使用它(参见多蒙特卡罗示例)。
相关文章:
- 如何对多维 std::vector 的所有元素求和?
- 使用 C++17 或更高版本对向量中的元素对求和的最'functional'方法?
- 在 MPI 中逐个元素对数组元素求和和收集
- 以C++递归方式对链表中的元素求和
- CUDA:所有矢量元素的级联求和
- 将彼此平行的两个 int 向量的元素求和
- 使用变换和加 () 对向量的元素进行求和和模 10^9+7<int>。有什么办法可以做到这一点吗?
- 用以下方法对数组中的元素求和的有效方法是什么
- 难以对 2D 矢量的元素求和
- 循环访问 CUDA 中的三维数组以对它们的元素求和
- 如何将函数静态应用于非类型模板包的各个元素并对结果求和
- 我如何确定我是否可以将数组中的某些元素求和为 K
- 在C++中使用do-while循环对向量的元素求和
- 在c++中对最小数组元素求和
- 递归算法对数组中值小于x的每个元素求和
- 如何使用本函数对两个字符数组进行元素相乘,并将相乘结果求和为int
- 如何对一个公共矩阵中的所有元素求和
- 通过迭代器对map的元素求和
- 如何在c++中对multimap中具有相同键的所有元素求和
- 在一个数组中查找求和为k的两个元素