error: class "cooperative_groups::__v1::thread_block" has no member "is_valid"

error: class "cooperative_groups::__v1::thread_block" has no member "is_valid"

我们正在尝试使用 CUDA 中的一些协作组功能来编写一个小应用程序。我们正在使用带有 CUDA 11.0 的 Tesla V100 卡。 但是在 thread_block 中使用 is_valid() 方法时会出现以下错误:

error: class "cooperative_groups::__v1::thread_block" has no member "is_valid"

在CUDA提供的samplesimpleCooperativeGroups.cu中,在内核cgkernel()中使用is_valid方法时,可以看到这个错误。修改后的示例代码片段如下所示。

__global__ void cgkernel(){


// threadBlockGroup includes all threads in the block
thread_block threadBlockGroup = this_thread_block();
int threadBlockGroupSize=threadBlockGroup.size();

// workspace array in shared memory required for reduction
extern __shared__ int workspace[];

int input, output, expectedOutput;

// input to reduction, for each thread, is its' rank in the group
input=threadBlockGroup.thread_rank();

// expected output from analytical formula (n-1)(n)/2
// (noting that indexing starts at 0 rather than 1)
expectedOutput=(threadBlockGroupSize-1)*threadBlockGroupSize/2;

// perform reduction
output=sumReduction(threadBlockGroup, workspace, input);

bool valid = threadBlockGroup.is_valid();
.
.
.
}

任何解决此问题的建议都会有很大帮助。

研究cooperative_groups.h,似乎提供is_valid()方法的cg 类只有grid_groupmulti_grid_group.

因此,目前只有这些群体可以使用该方法,您不应尝试将该方法用于其他类型的群体;我认为最好的假设是其他组类型始终被认为是有效的。

我怀疑这里的逻辑是网格和多网格组具有适当的启动配置和平台要求;它们可能无效。其他组类型不能无效(至少在那些方面),无法在任何支持的平台或启动配置上创建。我不打算将其作为任何可能解释下的防弹声明,而是一般指南或推理。