我的程序有很多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