我认为这应该是一个非常常见的场景,例如,如果您有一个类和一些方法。如果你想为它们编写单元测试,比如 test_method_1、test_method_2、... test_method_n,我不想为这些测试函数中的每一个实例化类对象,它可能是多余的或低效的。但是,我阅读了 Pytest 的文档,在我看来,例如使用夹具装饰,虽然它似乎只编写了一次类实例化,但实际上每次传递给新的测试函数时都会调用该实例化。有没有办法不这样做,而是我只创建一次类对象,并且所有测试都在这个对象中完成?
我喜欢对多个块进行 CUDA 同步。它并不是对于 __syncthreads() 可以轻松处理的每个块。
我看到关于这个主题的现有讨论,例如cuda 块同步,我喜欢 @johan 提出的简单解决方案, https: //stackoverflow.com/a/67252761/3188690,本质上它使用 64 位计数器跟踪同步块。
但是,我编写了以下代码试图完成类似的工作,但遇到了问题。这里我使用这个术语environment
是为了使wkNumberEnvs
这个环境中的块能够同步。它有一个柜台。我曾经atomicAdd()
计算有多少块已经自己同步,一旦同步块的数量 == wkBlocksPerEnv
,我就知道所有块都完成了同步,并且可以自由运行。然而,它有一个奇怪的结果,我不确定为什么。
问题就出在这个while循环上。由于所有块的第一个线程都在执行atomicAdd,因此有一个while循环来检查,直到条件满足。但我发现有些块会陷入无限循环,我不确定为什么最终无法满足条件?如果我在 或 中打印一些消息*** I can print here 1
,*** I can print here 2
则不会出现无限循环,一切都很完美。我没有看到明显的东西。
const int wkBlocksPerEnv = 2;
__device__ int env_sync_block_count[wkNumberEnvs];
__device__ void syncthreads_for_env(){
// sync threads for each block so all threads in this block finished the previous tasks
__syncthreads();
// sync threads for wkBlocksPerEnv blocks for each environment …
Run Code Online (Sandbox Code Playgroud)