2012-04-20 2 views
2

안녕하세요, 나는 바이트를 비교할 필요가 커널 기능이 있습니다. 검색하고자하는 영역을 블록으로 나누어 4k 바이트의 배열을 4k/256 = 16 블록으로 나눕니다. 블록의 각 스레드는 idx에 배열을 읽어서 다른 배열과 비교합니다. 여기서 내가 찾고자하는 것이 있습니다. 두 가지 방법으로이 작업을 수행했습니다 :CUDA 공유 메모리가 글로벌보다 빠르지 않습니까?

1. 전역 메모리의 데이터를 비교하지만 블록의 스레드는 종종 동일한 주소를 읽어야합니다.

2. 전역 메모리에서 공유 메모리로 데이터를 복사하고 위에서 언급 한 것과 같은 방식으로 공유 메모리의 바이트를 비교하십시오. 동일한 주소 읽기 문제가 여전히 있습니다. 공유 메모리에 복사는 다음과 같습니다 : 코드의

myArray[idx] = global[someIndex-idx]; 
whatToSearch[idx] = global[someIndex+idx]; 

나머지는 동일합니다. 예제 2의 데이터 조작 만 공유 배열에서 수행됩니다.

그러나 첫 번째 옵션은 공유 메모리를 사용하는 것보다 약 10 % 빠릅니다. 왜 ?? 설명해 주셔서 감사합니다.

+0

전체 예제를 게시하십시오. 그것없이 모든 현재의 답변은 순수한 추측입니다. 아래 답변에 대한 귀하의 의견은 당신이하는 일을 분명히하기에 충분하지 않습니다. – harrism

답변

9

데이터를 한 번만 사용하고 블록의 여러 스레드간에 데이터를 다시 사용하지 않는 경우 공유 메모리를 사용하면 실제로 속도가 느려집니다. 그 이유는 전역 메모리에서 공유로 데이터를 복사 할 때 여전히 글로벌 트랜잭션으로 간주되기 때문입니다. 공유 메모리에서 읽을 때 읽기가 더 빠르지 만 이미 전역 메모리에서 한 번 읽어야했기 때문에 중요하지 않으며 공유 메모리에서 읽는 두 번째 단계는 가치있는 것을 제공하지 않는 추가 단계입니다. .

공유 메모리를 사용하면 같은 데이터를 여러 번 액세스해야 할 때만 유용합니다 (동일한 스레드 또는 같은 블록의 다른 스레드).

+0

공유 메모리는 비효율적 인 액세스 패턴을 잘 결합 된 패턴으로 변환하는 데 유용 할 수 있습니다. 전치 연산을 위해 – Tom

1

전역 메모리에 대한 액세스를 절약하기 위해 공유 메모리를 사용하고 있지만 각 스레드는 여전히 전역 메모리에 대해 두 번 액세스하므로 빠른 속도가 아닙니다. 속도 저하는 블록 내의 전역 메모리에서 같은 위치에 액세스하는 스레드가 공유 메모리의 동일한 위치로 스레드를 읽으려고 시도하기 때문에 발생합니다.이 스레드를 직렬화해야합니다.

내가 게시 한 코드에서 수행하는 작업이 정확히 무엇인지 확신 할 수 없지만 블록의 모든 스레드에서 집계 된 global의 읽기 및 쓰기 횟수가 상당히 낮아야합니다 공유 메모리를 사용할 때. 그렇지 않으면 성능이 향상되지 않습니다.

+0

while (global_array [someIndex-idx + match] == global_array [someIndex + idx + match]); { 일치 ++; } // 분석 된 데이터로 작업을 수행하십시오. 이것은 내가하고있는 일이다. – Hlavson

+0

블록의 스레드가 액세스 할 수있는 global_array 위치의 최대 범위는 무엇입니까? someIndex는 스레드간에 정적입니까? – Vanwaril

+0

정적 인덱스입니다. 블록의 모든 스레드에 대해 동일하지만 모든 다음 블록마다 약간 다릅니다. 블록 0과 같은 것이 인덱스 (744-1000) & (1000-1256), 블록 1 (488-744) & (1000-1256) 등의 데이터로 작업하고 있습니다. – Hlavson

관련 문제