【发布时间】:2016-02-11 04:05:21
【问题描述】:
我的程序有很多 4 字节字符串,例如“aaaa”“bbbb”“cccc”...我需要收集通过 crc 检查的特定字符串。
因为字符串通过 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线程安全呢?
【问题讨论】:
-
我相信您正在尝试重新发明 Stream 压缩,尤其是 Gather 操作,效率非常低。并行编程通常需要不同的思考。例如,您避免竞争,而不是尝试用原子和锁来解决它们(序列化有点违背并行化的目的)。你可能会使用thrust::copy_if。
标签: cuda thread-safety gpu-atomics