Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.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中的线程和块结构以及如何分配具有不同结构(c+;+;)的线程_C++_Cuda_Nvidia - Fatal编程技术网

C++ CUDA中的线程和块结构以及如何分配具有不同结构(c+;+;)的线程

C++ CUDA中的线程和块结构以及如何分配具有不同结构(c+;+;)的线程,c++,cuda,nvidia,C++,Cuda,Nvidia,我刚刚开始学习cuda和并行编程,我在这方面遇到了困难。如果我这样声明线程块的大小和结构: addKernel << < 1, 5 >> > (dev_c, dev_a, dev_b); 对于添加2个较大的数组大小(大小为2^23-1),我将如何执行此操作。我不明白上面的术语是什么意思,以及如何在上面的CUDA addKernel行中表示它们 const int arraySize = 2^23-1; int a[arraySize] = { 0 }; in

我刚刚开始学习cuda和并行编程,我在这方面遇到了困难。如果我这样声明线程块的大小和结构:

addKernel << < 1, 5 >> > (dev_c, dev_a, dev_b);
对于添加2个较大的数组大小(大小为2^23-1),我将如何执行此操作。我不明白上面的术语是什么意思,以及如何在上面的CUDA addKernel行中表示它们

const int arraySize = 2^23-1;
int a[arraySize] = { 0 };
int b[arraySize] = { 0 };
int c[arraySize] = { 0 };

上面我定义了数组大小并初始化了a、b和c。我正在尝试编写代码,并行添加a和b的内容,并将结果存储在c中。我将如何以上述方式塑造线程结构并在线程之间分割任务?非常感谢。我试图通过实现不同的线程和块组织方式来进一步理解线程层次结构。

执行配置的左侧(
)提供网格维度(即网格中的块数),右侧提供块维度(即块中的线程数)。请注意,在运行时API内核启动语法中可能有多达四个参数,但最后两个参数与本讨论无关

例如:

  • 在x和y方向分别有两个线程的单个2D块:
    (请注意,
    dim3
    的默认值为1)

  • 单个3D块:

  • 一维网格中的多个二维块:
    (“四个二维块”)

  • 二维网格中的多个二维块:
    (“x方向三个二维块,y方向三个二维块”)

  • 三维网格中的多个二维块:
    (“x-dir中的三个二维块,y-dir中的四个,z-dir中的五个”)

  • 一维网格中的多个三维块:
    (“五个三维块”)


  • 关于你的后一个问题(对不起,这有点长):

    一般来说,您只需要一个维度。2D和3D只是解决某些问题的方便工具(例如,2D用于卷积)。因此,如何选择尺寸取决于问题

    还请记住,每个块的线程数是非常有限的(对于x和y维度,通常是1024个…现在不确定z,但关键是每个块不能有那么多线程)

    对于您的添加,您最终会执行以下操作:您决定每个块需要多少线程,比如说
    numThreads
    (我认为建议使用32的倍数,例如32或256),然后将块数计算为
    ceil(n/numThreads)
    ,其中
    n
    是数组的大小。这将确保您的线程数至少与数组中的元素数相同

    例如,如果您的数组有
    n=1000
    元素,并且您决定选择
    numThreadsPerBlock=32
    ,则会得到
    ceil(1000/32)=ceil(31.25)=32
    块。这意味着您的内核将使用
    numBlocks*numThreadsPerBlock=32*32=1024
    线程启动。由于现在线程多于元素,您可能需要通过内核中的某些条件来检查这一点:
    if(idx

    在您的示例中,1D栅格和1D块就可以了。您可能希望每个块有多个线程(例如256或1024个),否则您可能会超过设备的块限制,因为在您的示例中
    n
    相当大

    my\u addition\u kernel>(da、db、dc)

    这样就有8192个块,每个块有1024个线程


    (有时候你不能一次把所有的东西都放进设备中。然后你必须改变一下,例如,对子数据进行多次迭代。)

    谢谢你的回答,它帮了大忙,我可以问一下,在其他情况下,你会如何为这个问题分配线程,因为不幸的是,这是任务的一部分。int i=threadIdx.x;是我用于线程分配的代码。对于其他6个场景,这将如何改变?谢谢,我不会一一介绍,但例如,对于一维网格中的多个二维块,我认为您可以执行
    ,对于二维网格中的多个二维块:
    。您基本上是将1D案例拆分,但总体线程保持不变。我在这里假设
    numThreadPerBlock=1024
    。我从来没有像这样调用过添加内核,我也没有仔细检查过。
    int I=threadIdx.x
    将是每个块的本地内核,一个块中肯定不能有多个
    2^23
    。要获取全局索引,请执行以下操作:
    int i=blockIdx.x*blockDim.x+threadIdx.x
    。建议您缩小问题的范围,看起来您本质上是在要求提供有关CUDA的教程,并对一个特定示例进行后续操作。
    const int arraySize = 2^23-1;
    int a[arraySize] = { 0 };
    int b[arraySize] = { 0 };
    int c[arraySize] = { 0 };