C++ 支持独立线程调度的CUDA自旋锁实现?

C++ 支持独立线程调度的CUDA自旋锁实现?,c++,cuda,gpu,C++,Cuda,Gpu,现在(ITS)已经引入了一段时间,我想重新讨论一下在CUDA上实现简单自旋锁的情况 我的代码如下所示: //nvcc main.cu-arch=sm_75 #包括 #包括 #包括 #包括“cuda.h” constexpr int kN=21; 使用Ptr=uint8_t*; 结构动态节点{ int32_t lock=0; int32_t n=0; Ptr Ptr=nullptr; }; __全局函数0(DynamicNode*base){ 对于(int i=0;in),1); //进入临界段

现在(ITS)已经引入了一段时间,我想重新讨论一下在CUDA上实现简单自旋锁的情况

我的代码如下所示:

//nvcc main.cu-arch=sm_75
#包括
#包括
#包括
#包括“cuda.h”
constexpr int kN=21;
使用Ptr=uint8_t*;
结构动态节点{
int32_t lock=0;
int32_t n=0;
Ptr Ptr=nullptr;
};
__全局函数0(DynamicNode*base){
对于(int i=0;in),1);
//进入临界段
自动*锁定=&(dn->锁定);
while(原子EXCH(锁,1)==1){
}
__螺纹围栏();
//使用条件人为地提高复杂性
//编译器的循环展开方法
如果(dn->ptr==nullptr){
dn->ptr=重新解释铸件(0xf0);
}
//离开临界区
原子exch(锁,0);
__螺纹围栏();
}
}
int main(){
DynamicNode*dev_root=nullptr;
constexpr int kRootSize=sizeof(dynamicode)*kN;
cudamaloc((void**)和dev_root,kRootSize);
cudaMemset(dev_root,0,kRootSize);
func0(dev_根);
cudaDeviceSynchronize();
std::vector host_root(kRootSize/sizeof(int32_t),0);
cudaMemcpy(host_root.data(),dev_root,kRootSize,cudaMemcpyDeviceToHost);
cudaFree((void*)dev_root);
const auto*base=reinterpret_cast(host_root.data());
整数和=0;
对于(int i=0;istd::cout这似乎是编译器中的某种代码生成缺陷。解决方案似乎是更新到CUDA 11.2(或者可能在将来更新).

我大概可以在CUDA 11.1或之前复制观察结果。当我更新到CUDA 11.2时,问题就消失了。请将您的计算机更新到CUDA 11.2并重新测试。注意,这可能还需要加载新的GPU驱动程序。感谢您的回复!是的,我确实在使用CUDA 11.1。我看到有些不同,但也有一些问题ggy,带有RTX6000和CUDA 10.2.89.Hi的数字,我已经更新了我的帖子。CUDA 11.2只在
kN=21
时工作,但不适用于更大的
kN=128
。您可以访问developer.nvidia.com。
i=0 len=21
i=1 len=230
i=2 len=19
i=3 len=18
i=4 len=17
i=5 len=16
i=6 len=15
i=7 len=14
i=8 len=13
i=9 len=12
i=10 len=11
i=11 len=10
i=12 len=9
i=13 len=8
i=14 len=7
i=15 len=6
i=16 len=5
i=17 len=4
i=18 len=3
i=19 len=2
i=20 len=1
sum=441 expected=441