Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在cuda中将3D阵列展平为1D_C++_Arrays_Indexing_3d_Cuda - Fatal编程技术网

C++ 在cuda中将3D阵列展平为1D

C++ 在cuda中将3D阵列展平为1D,c++,arrays,indexing,3d,cuda,C++,Arrays,Indexing,3d,Cuda,我有下面的代码,我正试图在cuda中实现,但在cuda中我遇到了将3D阵列展平到1D的问题 C++代码 for(int i=0; i<w; i++) for(int j=0; j<h; j++) for(int k=0; k<d; k++) arr[h*w*i+ w*j+ k] = (h*w*i+ w*j+ k)*2; for(int i=0;i考虑一个大小为wxhxd的3D问题(这可能是一个简单的数组,必须像您的问题或任何其他易于并行化的3D问题一样设

我有下面的代码,我正试图在cuda中实现,但在cuda中我遇到了将3D阵列展平到1D的问题

C++代码

for(int i=0; i<w; i++)
  for(int j=0; j<h; j++)
    for(int k=0; k<d; k++)
     arr[h*w*i+ w*j+ k] = (h*w*i+ w*j+ k)*2;

for(int i=0;i考虑一个大小为
w
x
h
x
d
的3D问题(这可能是一个简单的数组,必须像您的问题或任何其他易于并行化的3D问题一样设置)。我将使用您的简单设置任务进行演示

使用CUDA内核处理此问题的最简单方法是为每个数组条目启动一个线程,即
w*h*d
threads。讨论了为什么每个元素一个线程并不总是最佳解决方案

现在让我们看看下面几行代码

dim3 numThreads(w,h,d);
getIndex <<<1, numThreads>>> (d_A, w, h, d);

但是这个内核和内核调用有一个问题:每个线程块的线程数是有限的(而且“特定方向上的线程数”是有界的=z方向通常是最有界的)。因为我们只调用一个线程块,所以问题的大小不能超过这些特定的限制(例如,
w*h*d考虑一个大小为
w
x
h
x
d
的3D问题(这可能是一个简单的数组,必须像您的问题或任何其他易于并行化的3D问题一样进行设置。)我将使用您的简单设置任务进行演示

使用CUDA内核处理此问题的最简单方法是为每个数组条目启动一个线程,即
w*h*d
threads。讨论了为什么每个元素一个线程并不总是最佳解决方案

现在让我们看看下面几行代码

dim3 numThreads(w,h,d);
getIndex <<<1, numThreads>>> (d_A, w, h, d);

但是这个内核和内核调用有一个问题:每个线程块的线程数是有限的(而且“特定方向上的线程数”是有界的=z方向通常是最有界的)。因为我们只调用一个线程块,所以问题的大小不能超过这些特定的限制(例如,代码> W*H*D)你应该看看CUDA指南,尤其是在。你可以“调用CUDA内核在三个维度”。我认为这是你想做的,但是你没有。也考虑你应该每一个块都要启动一个以上的线程。你应该看看CUDA指南,特别是在。你可以。“调用CUDA内核在三个维度”。我认为这是你想做的,但是你没有做。也考虑你应该每一个块启动一个以上的线程。
__global__ void getIndex(float* A, int w, int h, int d) // we actually do not need w
{
    int i = threadIdx.x;
    int j = threadIdx.y;
    int k = threadIdx.z;
    A[h*d*i+ d*j+ k] = h*d*i+ d*j+ k;
}
dim3 numBlocks(w/8,h/8,d/8);
dim3 numThreads(8,8,8);
getIndex <<<numBlocks, numThreads>>> (d_A, w, h, d);
__global__ void getIndex(float* A, int w, int h, int d) // we actually do not need w
{
    int bx = blockIdx.x;
    int by = blockIdx.y;
    int bz = blockIdx.z;
    int tx = threadIdx.x;
    int ty = threadIdx.y;
    int tz = threadIdx.z;
    A[h*d*(8*bx + tx)+ d*(8*by + ty)+ (8*bz + tz)] = h*d*(8*bx + tx)+ d*(8*by + ty)+ (8*bz + tz);
}