2011-10-01 4 views
14

저는 몇 가지 프로젝트에서 OpenCL을 사용해 왔지만 항상 하나의 (때로는 다소 큰) 기능으로 커널을 작성했습니다. 이제는 좀 더 복잡한 프로젝트를 진행하면서 여러 커널에서 기능을 공유하고 싶습니다.대형 OpenCL 커널을 구조화하는 방법은 무엇입니까?

그러나 예제에서는 모두 하나의 파일로 커널을 보여줍니다 (아주 적은 수의 2 차 함수 호출). 복수 파일을 사용할 수 있어야합니다. clCreateProgramWithSource()은 여러 문자열을 허용합니다 (그리고 결합한다고 가정합니다). pyopencl의 Program()은 하나의 소스 만 사용합니다.

그래서 경험이 일을 함께 사람을 듣고 싶습니다

  • 여러 소스 파일과 관련된 어떤 문제가 있습니까?
  • 단순히 파일을 연결하기 위해 pyopencl을 사용하는 것이 가장 좋은 방법입니까?
  • (모든 것이 사용되지는 않더라도 각 커널과 함께 라이브러리 소스를 전달하는 대신) 함수 라이브러리를 컴파일 할 수있는 방법이 있습니까?
  • 매번 라이브러리 소스를 전달해야하는 경우 사용되지 않는 기능이 삭제됩니다 (오버 헤드 없음)?
  • 기타 모범 사례/제안 사항?

감사합니다.

+2

#include "part1.cl"#include "part2.cl"을 갖는 하나의 연결 파일을 만들 수 있습니다. 이것은 나를 위해 일합니다 (NVidia 컴파일러), 아마 모든 것이 컴파일 될 때마다 실행됩니다. 함수 코드가 각 커널에 인라인되어 있기 때문에 미리 컴파일 된 함수 라이브러리가 약간 공상 과학적이라고 생각합니다. 그래서 재귀 함수를 작성할 수 없습니다. 덕분에 –

답변

6

OpenCL에는 프로그램에서 여러 소스 파일의 개념이 있다고 생각하지 않습니다. 프로그램은 하나의 컴파일 단위입니다. 그러나 #include를 사용하고 컴파일시 헤더 또는 기타 .cl 파일을 가져올 수 있습니다.

OpenCL 프로그램에서 여러 커널을 사용할 수 있습니다. 따라서 한 컴파일 후에 컴파일 된 커널 세트를 호출 할 수 있습니다.

기능이 없거나 정적으로 도달 할 수없는 것으로 알려진 모든 코드는 컴파일하는 동안 약간의 비용을 들이지 않고 제거 될 수 있다고 가정 할 수 있습니다.

+0

. 이것이 내가하는 일이다. 그러나 좌절감으로 pyopencl은 커널을 캐싱 할 때 #include 내용을 고려하지 않습니다. 따라서 "라이브러리"파일을 변경해도 캐시를 수동으로 삭제하지 않고 컴파일 된 커널에는 영향을 미치지 않습니다. 어쨌든, 나는 누군가가 당신을 최고로 (그리고 오직!) 마킹하기 전에 더 좋은 아이디어를 가지고 있는지보기를 기다릴 것입니다. 건배. –

+0

사실이라면 clCreateProgramWithSource의 구문이 상당히 어색하지 않습니까? 아닙니다. 명시 적으로 여러 개의 문자열과 각 문자열의 길이가 필요합니다. 나는 그것이 실제로 작동하는지 잘 모르겠다. (나는 그것을 작동 시키려고 노력하고있다.)하지만 구문이 주어진다면 이상하게 들린다. – user1111929

5

OpenCL 1.2에서는 다른 오브젝트 파일을 함께 연결합니다.

+0

thanks; 내가 맨 위로 opencl work를 얻을 때 이것을 시도 할 것이다. –