Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.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/user-interface/2.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
CUDA内核函数中的内存访问(简单示例)_Cuda_Gpgpu - Fatal编程技术网

CUDA内核函数中的内存访问(简单示例)

CUDA内核函数中的内存访问(简单示例),cuda,gpgpu,Cuda,Gpgpu,我是GPU并行计算的新手,我正试图通过查看NVidia“CUDA的例子”一书中的一些例子来学习CUDA 在这样一个简单的例子(两个向量的点积)中,我不理解线程是如何访问和改变变量的 内核函数的定义如下 __global__ void dot( float *a, float *b, float *c ) { __shared__ float cache[threadsPerBlock]; int tid = threadIdx.x + blockIdx.x * blockDi

我是GPU并行计算的新手,我正试图通过查看NVidia“CUDA的例子”一书中的一些例子来学习CUDA

在这样一个简单的例子(两个向量的点积)中,我不理解线程是如何访问和改变变量的

内核函数的定义如下

__global__ void dot( float *a, float *b, float *c ) {    
  __shared__ float cache[threadsPerBlock];   
 int tid = threadIdx.x + blockIdx.x * blockDim.x;    
 int cacheIndex = threadIdx.x;
 float   temp = 0;

 while (tid < N) {
    temp += a[tid] * b[tid];
    tid += blockDim.x * gridDim.x;
  }

    // set the cache values
  cache[cacheIndex] = temp;
\uuuu全局\uuuuu无效点(浮点*a,浮点*b,浮点*c){
__共享_uuuu浮点缓存[threadsPerBlock];
int tid=threadIdx.x+blockIdx.x*blockDim.x;
int cacheIndex=threadIdx.x;
浮动温度=0;
而(tid
我不明白三件事

  • 此函数的执行顺序是什么?线程之间是否有任何顺序?例如,第一个是第一个块中的线程,然后第二个块中的线程开始运行,依此类推(这与为什么需要将线程划分为块的问题有关)

  • 所有线程是否都有自己的“temp”变量副本(如果没有,为什么没有争用条件?)

  • 它是如何操作的?while循环中变量temp的具体内容是什么?数组缓存存储不同线程的temp值。求和是如何进行的?似乎temp已经包含了点积所需的所有求和,因为变量tid在while循环中从0变为N-1


  • 尽管您提供的代码不完整,但以下是关于您所问问题的一些澄清:

  • 内核代码将由所有块中的所有线程执行。“分割作业”的方法是使线程只在一个或几个元素上工作。 例如,如果必须使用特定算法处理100个整数,则可能需要100个线程处理每个元素。 在CUDA中,块和线程的数量在主机端的内核启动时定义:
  • myKernel(…);

    其中,网格线程dim3,用于定义三维尺寸

    线程和块的执行没有特定的顺序。正如您在那里看到的: 第6页:“没有分派和执行块的特定顺序”

  • 由于temp变量在内核中没有特定的定义,因此它不是分布式的,每个线程都将该值存储在寄存器中
  • 这相当于在CPU端执行的操作。所以是的,这意味着每个线程都有自己的“temp”变量

  • temp变量在循环的每次迭代中使用对设备阵列的访问进行更新
  • 同样,这相当于在CPU端执行的操作

    我认为,在深入研究GPU编程之前,您可能应该检查一下自己是否对CPU端的C/C++编程有足够的了解。
    由于CUDA允许您使用C代码驱动GPU,困难不在于语法,而在于硬件的特殊性。

    谢谢您的回答。我想我的问题可能有误导性,因为您的答案不是我所问的。很遗憾,我的意思是:1)线程之间是否存在任何序列?例如,第一个a从第一个块重新分配线程,然后从第二个块重新分配线程,依此类推(这与为什么需要将线程划分为块的问题有关);2)所有线程是否都有自己的“temp”变量副本(如果没有,为什么没有争用条件?);请参阅我更新的答案。在块内或块之间,线程执行没有特定顺序。是的,每个线程都存储其临时值,您了解片上寄存器是什么吗?非常感谢您编辑的答案。我想我了解片上寄存器是什么(尽管我无法说出确切的定义)所以,“temp”变量没有竞争条件,因为它不是共享的,每个线程都有自己的“thread”变量副本,对吗?我不称它为“copy”,因为这可能意味着误解,但正如我在编辑后的回答中所写的,是的,每个线程都有自己的“temp”如果我的回答有助于考虑接受它来帮助那些必须回答未回答的问题的主持人;