Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.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 - Fatal编程技术网

CUDA:共享内存分配

CUDA:共享内存分配,cuda,Cuda,假设我在cuda内核中定义了一个共享变量,如下所示: __shared__ int var; 现在,让我们假设在我的内核中的某个时刻,我想给变量赋值,比如说100 导致块中的所有线程执行此分配 我怎么能让作业只进行一次?这是我唯一的选择: if( threadIdx.x == 0) var = 100; 你唯一的选择实际上是: if( threadIdx.x == 0) var = 100; __syncthreads(); 如果省略同步障碍,则无法保证在执行赋值语句后块

假设我在cuda内核中定义了一个共享变量,如下所示:

__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都会赢。嗯?问题是我怎样才能让任务只进行一次?[我的重点],答案是,条件赋值+同步。