CUDA:共享内存分配
假设我在cuda内核中定义了一个共享变量,如下所示:CUDA:共享内存分配,cuda,Cuda,假设我在cuda内核中定义了一个共享变量,如下所示: __shared__ int var; 现在,让我们假设在我的内核中的某个时刻,我想给变量赋值,比如说100 导致块中的所有线程执行此分配 我怎么能让作业只进行一次?这是我唯一的选择: if( threadIdx.x == 0) var = 100; 你唯一的选择实际上是: if( threadIdx.x == 0) var = 100; __syncthreads(); 如果省略同步障碍,则无法保证在执行赋值语句后块
__shared__ int var;
现在,让我们假设在我的内核中的某个时刻,我想给变量赋值,比如说100
导致块中的所有线程执行此分配
我怎么能让作业只进行一次?这是我唯一的选择:
if( threadIdx.x == 0)
var = 100;
你唯一的选择实际上是:
if( threadIdx.x == 0)
var = 100;
__syncthreads();
如果省略同步障碍,则无法保证在执行赋值语句后块中的所有线程都将读取var值。您唯一的选择实际上是:
if( threadIdx.x == 0)
var = 100;
__syncthreads();
如果省略了同步障碍,则无法保证在执行赋值语句后块中的所有线程都将读取var值。指定执行赋值的线程是否有任何错误?你在寻找什么样的替代方案?也许他害怕if声明的出现?我认为在这种情况下,它不会惩罚表现。我的问题是:对于没有if语句的第一个解决方案,每个线程都执行一次内存写入。它是并行发生还是写入被序列化?换句话说,哪一个是计算效率最高的解决方案?@alrikai:不,指定一个特定的线程没有错;我只是想,也许编译器会足够聪明,能够发现所有线程都在做同样的事情,并且只做一次。从语义上来说,省略线程分配只是稍微干净一点。指定线程来执行分配有什么问题吗?你在寻找什么样的替代方案?也许他害怕if声明的出现?我认为在这种情况下,它不会惩罚表现。我的问题是:对于没有if语句的第一个解决方案,每个线程都执行一次内存写入。它是并行发生还是写入被序列化?换句话说,哪一个是计算效率最高的解决方案?@alrikai:不,指定一个特定的线程没有错;我只是想,也许编译器会足够聪明,能够发现所有线程都在做同样的事情,并且只做一次。从语义上讲,省略线程分配只是稍微干净一点。如果省略if语句但离开了障碍,会发生什么?@JackOLantern:可能是一个存储尝试对每个warp执行var,并且每个warp都会在bar.sync指令处暂停,直到计数器减为零。您的意思是warp中的所有线程都试图更改var的值吗?或者只有一个线程正在尝试?如果是,哪一个?如果一个warp中的所有线程都试图存储,那么这些尝试是否以某种方式序列化了?@JackOLantern:所有线程都会尝试,但只有每个warp一个会赢,无论这是序列化还是其他不透明的实现细节,在某些体系结构上,不是每个warp都会赢。嗯?问题是我怎样才能让任务只进行一次?[emphasis mine],答案是,条件赋值+同步。如果省略if语句但离开了障碍,会发生什么?@JackOLantern:可能每个warp有一个存储尝试var,并且每个warp都会在bar.sync指令处暂停,直到计数器减为零。您的意思是warp中的所有线程都试图更改var的值吗?或者只有一个线程正在尝试?如果是,哪一个?如果一个warp中的所有线程都试图存储,那么这些尝试是否以某种方式序列化了?@JackOLantern:所有线程都会尝试,但只有每个warp一个会赢,无论这是序列化还是其他不透明的实现细节,在某些体系结构上,不是每个warp都会赢。嗯?问题是我怎样才能让任务只进行一次?[我的重点],答案是,条件赋值+同步。