__all_sync和__any_sync的使用问题,书P119
老师好,我在学习“11.3 更多线程束内的基本函数”时,运行github中warp.cu。 书上以及理论上的结果应该是 all_sync (FULL_MASK): 0 all_sync (mask1): 1 any_sync (FULL_MASK): 1 any_sync (mask2): 0 然而,我运行出的结果是 all_sync (FULL_MASK): 0 all_sync (mask1): 0 any_sync (FULL_MASK): 1 any_sync (mask2): 1
我知晓本书所参考的是 CUDA 10 版本,而我使用的是Cuda12.8, 但是查手册, __all_sync(unsigned mask, predicate): Evaluate predicate for all non-exited threads in mask and return non-zero if and only if predicate evaluates to non-zero for all of them.
__any_sync(unsigned mask, predicate): Evaluate predicate for all non-exited threads in mask and return non-zero if and only if predicate evaluates to non-zero for any of them 这两个函数的作用应该没有因为Cuda版本的更新而产生改变。
我使用的设备:NVIDIA GeForce RTX 3070 Laptop GPU+Cuda 12.8
谢谢,您发给我的邮件已经收到,我会尽快处理。Thank you,the email you sent me has been received and I will handle it as soon as possible.王景博fever wong
在CSDN上有人也反映了相同的问题,说明这个应该不是个例? https://blog.csdn.net/qq_41824697/article/details/143749313
还有一个问题,可能是因为我哪里有理解误区。 当我使用以下代码时,Cuda的运行会卡住,形成类似于死循环的效果。 if (tid == 0) printf("all_sync (FULL_MASK %x ): %d\n", FULL_MASK,__all_sync(FULL_MASK, tid)); 这句话我想做的事情是省去result寄存器,直接输出结果。
我使用的代码段如下: if (tid == 0) printf("FULL_MASK = %x\n", FULL_MASK); if (tid == 1) printf("mask1 = %x\n", mask1); if (tid == 0) printf("mask2 = %x\n", mask2);
int result;
__syncwarp();
result = __all_sync(FULL_MASK, tid); if (tid == 0) printf("all_sync (FULL_MASK %x ): %d\n", FULL_MASK,result); if (tid == 0) printf("all_sync (FULL_MASK %x ): %d\n", FULL_MASK,__all_sync(FULL_MASK, tid));
result = __all_sync(mask1, tid); if (tid == 1) printf("all_sync (mask1 %x ): %d\n", mask1,result); if (tid == 1) printf("all_sync (mask1 %x ): %d\n", mask1,__all_sync(mask1, tid)); __syncwarp(); result = __all_sync(mask2, tid); if (tid == 1) printf("all_sync (mask2 %x ): %d\n", mask2,result); if (tid == 1) printf("all_sync (mask2 %x ): %d\n", mask2,__all_sync(mask2, tid)); __syncwarp(); 使用线程束同步的原因是控制运行进程,确定出问题的语句是 if (tid == 0) printf("all_sync (FULL_MASK %x ): %d\n", FULL_MASK,__all_sync(FULL_MASK, tid)); if (tid == 1) printf("all_sync (mask1 %x ): %d\n", mask1,__all_sync(mask1, tid));