我的程序有很多4字节字符串,比如“aaaa”“bbbb”“cccc”...我需要收集通过crc检查的特定字符串。多个变量在CUDA中同步
因为字符串可以通过crc检查的可能性很小,所以我不想使用非常大的缓冲区来保存所有结果。我喜欢一个接一个的结果,就像输入一样。例如,如果输入是“aaaabbbbcccc”和“BBBB”未通过CRC校验,则输出字符串应该是“aaaacccc”和output_count应该为2
代码看起来像:
__device__
bool is_crc_correct(char* str, int len) {
return true; // for simplicity, just return 'true';
}
// arguments:
// input: a sequence of 4-bytes-string, eg: aaaabbbbccccdddd....
__global__
void func(char* input, int* output, int* output_count) {
unsigned int index = blockDim.x*blockIdx.x + threadIdx.x;
if(is_crc_correct(input + 4*index)) {
// copy the string
memcpy(output + (*output_count)*4,
input + 4*index,
4);
// increase the counter
(*output_count)++;
}
}
显然内存拷贝不是线程安全的,我知道atomicAdd函数可以用于++操作,但是如何使output和output_count线程安全?
我相信你正在试图重建*流压缩*,尤其是*采集*操作的效率非常低。并行编程通常需要不同的思考。例如,你避免竞争,而不是试图用原子和锁来解决它们(序列化有点违背并行化的目的)。你可以使用[thrust :: copy_if](https://thrust.github.io/doc/group__stream__compaction.html)。 – Drop