커널에 입력 배열이 있습니다. 각 스레드는 배열의 한 값으로 작업하고 규칙에 따라 값을 변경하거나 전혀 변경하지 않습니다.CUDA에서 std :: bitset 에뮬레이트
입력 메모리 내부에 변경 사항이있는 경우 매우 빨리 찾고 싶습니다.이 경우 변경 사항 (입력 배열의 인덱스)이 발생한 위치를 매우 빠르게 찾고 싶습니다.
비트 배열과 같은 것을 사용하려고 생각했습니다. 총 비트 수는 전체 스레드 수와 같습니다. 각 스레드는 하나의 비트 만 조작하므로 처음에는 비트가 false로 설정됩니다. 스레드가 해당 입력 값을 변경하면 비트는 참이됩니다.
의 우리가이 입력 배열이 비트의 배열이 작업은 다음
0 0 0 0 0 0
그래서 우리가 가지고있는 것 (6 개) 스레드 것 A
1 9 3 9 4 5
라는 있다고 가정하자, 좀 더 명확하게하기 위해서 입력 배열에. 의 최종 입력 배열이 될 것이라고 가정하자
1 9 3 9 2 5
그래서 비트의 최종 배열은 다음과 같습니다
0 0 0 0 1 0
나는 각각의 값이 걸릴 것이기 때문에 bool
의 배열을 사용하지 않으 내가 비트만을 사용하기 때문에 꽤 많은 메모리의 1 바이트.
이렇게 할 수 있습니까?
배열의 각 값이 8 비트가되는 char
배열을 만들려고했습니다. 그러나 두 개의 스레드가 배열의 첫 문자의 다른 비트를 변경하려면 어떻게해야합니까? 비트 내의 변경이 다른 위치에있을지라도 그들은 원자 적으로 연산을 수행해야 할 것입니다. 따라서 원자 연산을 사용하면 병렬 처리가 중단 될 수 있습니다.이 경우 원자 연산을 사용하는 것은 필요하지 않지만 이해가되지 않지만보다 전문화 된 것 대신 char 배열을 사용하는 제약 때문에 사용해야합니다. like std::bitset
감사합니다.
이 질문에 보이는을 당신처럼 많은 : http://stackoverflow.com/questions/11042816/how-to-create-large-bit-array -in-cuda – BenC
고맙습니다. 질문과 대답을 읽었지만 CUDA에서'std :: bitset'과 같은 것이 있다면 어떻게 배열을 사용할 수 있는지에 대해서는 말하지 않습니다. 'bool' 배열을 사용하는 것은 좋은 생각이 아닙니다. 왜냐하면 GPU에서 너무 많은 메모리를 사용할 수 없기 때문입니다. – ksm001