2014-11-21 2 views
0

각 방향으로 (N, N) 셀이있는 격자를 만들었습니다. 어떤 점이 어느 셀에 해당하는지 확인하고 싶습니다. 그러나 이것은 쉽습니다. 그러나 그리드에서 벗어날 수있는 몇 가지 점이 있습니다. 하나의 셀에 넣습니다.성능, 최소/최대 또는 모듈러스에 미치는 영향이 가장 적은 작업은 무엇입니까?

이것은 GPU에서 모두 수행되므로 제 질문은 유효 셀에 누락 된 포인트를 매핑하는 최상의 작업이 될 것입니다.

커널에서 분기를 도입 할 것으로 생각되는 max (0, min (N, cell.x))를 사용하는 첫 번째 옵션. 두 번째 옵션은 modulus (cell.x % N)를 사용하여 GPU에서 수행해야 할 매우 비싼 작업입니다.

어떤 것을 어떻게 사용할 것인지 결정할 수 있습니까?

+0

N에 대해 아는 것이 있습니까? 2의 거듭 제곱에 의한 모듈러스는 매우 싸다. – Jez

+0

나는 그것에 대해 생각하고 있었지만, 어떤 경우에는 필요한 메모리를 늘리는 것을 의미 할 것이라고 추측합니까? 하지만 잘 ... 그리드가 그렇게 크지 않아야 옵션이 될 수 있습니다. – BRabbit27

+1

'커널에서 분기를 도입 할 것으로 믿는 max (0, min (N, cell.x))를 사용하는 첫 번째 옵션 왜 이것이 분기가 발생할 것이라고 생각합니까? 이 함수들은'min.s32'와'max.s32'와 같은 매우 효과적인 분기없는 어셈블리에 매핑되어야합니다. 거기에는 분기가 없습니다. –

답변

2

GPU에는 정수 min()max()에 대한 하드웨어 지침이 있습니다. cuobjdump --dump-sass을 사용하여 nvcc로 컴파일 된 실행 파일에서 기계 코드를 덤프하면이 지침을 인식 할 수 있습니다 (예 : IMNMX 또는 VMNMX). "mnmx"는 "최소 또는 최대"를 나타내며, 두 작업 사이의 선택은 술어에 의한 것입니다).

컴파일 시간이 2의 일정한 경우 N의 경우 모듈로 연산은 LOP.AND 명령어로 매핑해야합니다. N의 다른 컴파일 타임 상수 값의 경우 일반적으로 정수 곱셈 및 시프 팅이 포함 된 작은 명령어 시퀀스가 ​​생성됩니다. 런타임에서 결정되는 변수 N에 대해, 모듈로 동작은 기본적으로 적어도 15 정도의 명령 인 완전한 정수 나누기를 요구할 것이다.

따라서 컴파일 시간 상수 N이 2의 거듭 제곱 인 경우 이외에 성능 측면에서 모듈 기반 솔루션보다 min()max()을 사용하는 클램핑이 바람직합니다. 그러나 코드가이 작업을 자주 수행하고 계산 처리량에 의해 제한되지 않는 한, 커널 수준의 성능 차이는 작거나 존재하지 않을 가능성이 큽니다 (예 : 코드의 메모리 대역폭이 제한된 경우).

관련 문제