2012-05-02 3 views
0

누군가가 장치에 __constant를 복사하고 호스트로 돌아 가기 위해 OpenCl 버전의 cudaMemcpyToSymbol을 말할 수 있습니까?
또는 보통 clenquewritebuffer (...)가 작업을 수행합니까?
포럼에서 많은 도움을 얻을 수 없습니다. 사실 몇 줄의 데모로 충분합니다.OpenCL 버전의 cudaMemcpyToSymbol 및 최적화

또한 CALDA에서 상수 캐시를 사용하는 것과 동일한 종류의 최적화를 opencl에서 기대할 수 있습니까?

감사

답변

0

OpenCL.Net에 대한 확실하지,하지만 일반 오픈 CL의 : 예, clenquewritebuffer 충분히 (단지 CL_MEM_READ_ONLY 플래그가 설정되어 버퍼를 생성하는 기억)입니다. 동일하고, 최적화의 동일한 유형을 제공하는 CUDA와 OpenCL을에서

c_Table[i] = clCreateBuffer(cxGPUContext, CL_MEM_READ_ONLY, QRNG_DIMENSIONS * QRNG_RESOLUTION * sizeof(unsigned int),  
       NULL, &ciErr); 
ciErr |= clEnqueueWriteBuffer(cqCommandQueue[i], c_Table[i], CL_TRUE, 0, 
      QRNG_DIMENSIONS * QRNG_RESOLUTION * sizeof(unsigned int), tableCPU, 0, NULL, NULL); 

상수 메모리 : 여기

Nvidia GPU Computing SDK (OpenCL을/SRC/oclQuasirandomGenerator/oclQuasirandomGenerator.cpp)에서 데모입니다. 즉, nVidia GPU를 사용하는 경우입니다. ATI GPU에서는 유사하게 동작해야합니다. 그리고 저는 일정한 메모리가 CPU에서 실행될 때 전역 적으로 이점을 줄 것이라고 생각합니다.

+0

CPU가 로컬 및 상수 현금 (CPU에는 없음)을 어떻게 처리합니까? – gpuguy

+0

@gpuguy OpenCL 메모리 개념과 기본 하드웨어 아키텍처의 실제 관계는 명시 적으로 지정되지 않았습니다. AFAIK. 나는 그들이 보통 RAM의 일부일 뿐이며 RAM에 대한 다른 액세스 (글로벌, 텍스처 등)와 같은 방식으로 캐시된다고 생각한다. – aland

2

저는 사람들이 커널에서 상수를 설정하는 데 cudaMemcpyToSymbol()을 사용하는 것을 보았으며 컴파일러는 코드를 최적화 할 때 이러한 상수를 이용할 수있었습니다. openCL에 메모리 버퍼를 설정하여 커널에 그러한 상수를 넘겨 주면 컴파일러는 코드를 최적화하기 위해 이들을 사용할 수 없습니다.

대신 해결책은 컴파일러의 기호를 정의하는 문자열에 cudaMemcpyToSymbol()을 인쇄하여 바꾼다는 것입니다. 컴파일러는 FOO 기호를 bar으로 설정하기 위해 -D FOO=bar 형식의 정의를 사용할 수 있습니다.