2011-05-06 2 views
4

최신 NVIDIA GPU는 32 비트 레지스터에 설정된 비트 수를 계산하는 __popc (x) 명령어를 지원합니다.팝콘?

99 % OpenCL은 공급 업체 커널 확장이 아니면 인라인 어셈블러를 지원하지 않습니다.

1) AMD 하드웨어가 아직 이것을 지원합니까? (나는 그것을 모르고있다).

2) OS X 및 Linux의 경우, 컴파일 할 NVIDIA 중간 언어를 어떻게 삽입하여 삽입 할 수 있습니까?

PyOpenCL에서 PTX "바이너리"를 덤프하는 방법을 알았습니다. 이제는 수정 사항을 다시 삽입하는 방법을 알아야합니다. 본인이 아는

#create the program 
self.program = cl.Program(self.ctx, fstr).build() 
print self.program.BINARIES[0] 

답변

1

는, 현재의 모든 OpenCL을 구현에는 인라인 어셈블리가 없으며, 거기에 어떤 방법이 OS X 또는 Linux에서 JIT 컴파일주기 동안 PTX (또는 CAL)를 가로 챌 수 있습니다.

popc은 NVIDIA compute 2.x 하드웨어의 하드웨어 명령어이지만 컴퓨팅 1.x 하드웨어에서는 에뮬레이트됩니다. CUDA 툴킷의 device_functions.h에서 코드를 찾을 수 있습니다. 속도를 희생하면서 OpenCL에서 함수로 구현할 수 있습니다.

2

NVIDIA의 nvcc는 OpenCL 코드에서 'asm'키워드를 사용하여 인라인 PTX 어셈블리를 지원합니다. 표기법은 GCC 인라인 어셈블리와 유사합니다. 현재 다음을 사용합니다 :

inline uint popcnt(const uint i) { 
    uint n; 
    asm("popc.b32 %0, %1;" : "=r"(n) : "r" (i)); 
    return n; 
} 

테스트를 거쳐 Ubuntu Linux에서 작동합니다.

자세한 내용을 보려면 NVIDIA의 oclInlinePTX 코드 샘플과 PTX ISA 설명서를 확인하십시오.

AMD 또는 Intel 카드를 사용하는 경우 OpenCL 1.2에 내장 된 popcount 명령을 사용할 수 있기 때문에 무관합니다.