나는 내 CUDA 코드에 커널을 가지고 있는데, 공유 메모리의 일부분에 많은 쓰레드를 쓰고 싶다. (전역 메모리를 사용하는 것보다 훨씬 빠르기 때문이다.) 그 결과를 전역 메모리에 쓴다. (그래서 나는 나중에 커널에서 사용할 수있다).CUDA의 멀티 스레드 커널에서 불필요한 쓰기 작업이 비효율적입니까?
__global__ void calc(float * globalmem)
{
__shared__ float sharemem; //initialize shared memory
sharemem = 0; //set it to initial value
__syncthreads();
//do various calculations on the shared memory
//for example I use atomicAdd() to add each thread's
//result to sharedmem...
__syncthreads();
*globalmem = sharedmem;//write shared memory to global memory
}
글로벌 메모리 공유으로부터 정말 한 번만를 작성해야 할 때마다 하나의 스레드가 데이터를 쓰고 있다는 사실, 나에게 비린내 느낌 : 커널은 다음과 같이 보입니다. 또한 모든 스레드가 공유 메모리를 코드 시작 부분에서 0으로 초기화한다는 사실에서 같은 느낌을받습니다. 현재 구현보다 빠른 방법이 있습니까?
! threadIdx.x는 무엇을 의미합니까? – MuneshSingh
이것은 C 프로그래밍 관련 질문입니다. 'threadIdx.x'는 변수입니다. C 언어에서이 값이 0이 아니면 부울 '참'값으로 간주됩니다. 부울'not' 연산자로 시작하기 때문에'threadIdx.x' 변수가 0 일 때 조건은 참입니다. 따라서'threadIdx.x' 변수가 0 인 쓰레드를 선택합니다. –
졸린 두뇌에 무슨 일이 일어 났는지 나는 모른다! Logical NOT이라고 생각하고있었습니다. :) – MuneshSingh