本文共 1610 字,大约阅读时间需要 5 分钟。
3.虽然__syncthreads()
一直被记录为同步线程块中的所有线程,但Pascal和以前的体系结构只能在warp级别强制执行同步。 在某些情况下,只要每条经线中至少有一条线达到屏障,就可以在不被每条线执行的情况下成功实现屏障。 从Volta开始,CUDA内置的__syncthreads()
和PTX指令bar.sync(及其衍生物)是针对每个线程实施的,因此在该块中的所有非退出线程到达之前都不会成功。 利用先前行为的代码可能会死锁,并且必须进行修改,以确保所有非退出的线程都到达障碍。
// Device code__global__ void MyKernel(...){ ...}// Host codeint carveout = 50; // 50% // Named Carevout Values: // carveout = cudaSharedmemCarveoutDefault; // (-1) // carveout = cudaSharedmemCarveoutMaxL1; // (0) // carveout = cudaSharedmemCarveoutMaxShared; // (100)cudaFuncSetAttribute(MyKernel, cudaFuncAttributePreferredSharedMemoryCarveout, carveout);MyKernel <<> >(...);
在这里,整数分割指定共享内存分割首选项占总资源的百分比。 这只是一个提示,如果需要执行该功能,驱动可以选择不同的比例。
计算能力7.0设备允许单个线程块寻址完整的96 KB共享内存。 依赖每块超过48 KB的共享内存分配的内核是特定于体系结构的,因此它们必须使用动态共享内存(而不是静态大小的数组),并且需要使用cudaFuncSetAttribute()进行显式选择,如下所示:// Device code__global__ void MyKernel(...){ ...}// Host codeint maxbytes = 98304; // 96 KBcudaFuncSetAttribute(MyKernel, cudaFuncAttributeMaxDynamicSharedMemorySize, maxbytes);MyKernel <<> >(...);
其他共享内存的行为与计算能力5.x的设备相同。
转载地址:http://ernkl.baihongyu.com/