CUDA内核函数中的内存访问(简单示例)
我是GPU并行计算的新手,我正试图通过查看NVidia“CUDA的例子”一书中的一些例子来学习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
__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
我不明白三件事
尽管您提供的代码不完整,但以下是关于您所问问题的一些澄清:
myKernel(…);
其中,网格和线程是dim3,用于定义三维尺寸
线程和块的执行没有特定的顺序。正如您在那里看到的:
第6页:“没有分派和执行块的特定顺序”
由于CUDA允许您使用C代码驱动GPU,困难不在于语法,而在于硬件的特殊性。谢谢您的回答。我想我的问题可能有误导性,因为您的答案不是我所问的。很遗憾,我的意思是:1)线程之间是否存在任何序列?例如,第一个a从第一个块重新分配线程,然后从第二个块重新分配线程,依此类推(这与为什么需要将线程划分为块的问题有关);2)所有线程是否都有自己的“temp”变量副本(如果没有,为什么没有争用条件?);请参阅我更新的答案。在块内或块之间,线程执行没有特定顺序。是的,每个线程都存储其临时值,您了解片上寄存器是什么吗?非常感谢您编辑的答案。我想我了解片上寄存器是什么(尽管我无法说出确切的定义)所以,“temp”变量没有竞争条件,因为它不是共享的,每个线程都有自己的“thread”变量副本,对吗?我不称它为“copy”,因为这可能意味着误解,但正如我在编辑后的回答中所写的,是的,每个线程都有自己的“temp”如果我的回答有助于考虑接受它来帮助那些必须回答未回答的问题的主持人;