템플릿 커널 함수의 주소를 CUDA 함수에 전달하는 방법은 무엇입니까?

hthms

커널 템플릿과 함께 CUDA 커널 함수 포인터를받는 CUDA 런타임 API 함수를 사용하고 싶습니다.

템플릿없이 다음을 수행 할 수 있습니다.

__global__ myKernel()
{
  ...
}

void myFunc(const char* kernel_ptr)
{
  ...
  // use API functions like
  cudaFuncGetAttributes(&attrib, kernel_ptr);
  ...
}

int main()
{
  myFunc(myKernel);
}

그러나 커널이 템플릿 인 경우 위의 내용은 작동하지 않습니다.

다른 예시:

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>

template<typename T>
__global__ void addKernel(T *c, const T *a, const T *b)
{
    int i = threadIdx.x;
    c[i] = a[i] + b[i];
}

int main()
{
    cudaFuncAttributes attrib;
    cudaError_t err;

    //OK:
    err = cudaFuncGetAttributes(&attrib, addKernel<float>); // works fine
    printf("result: %s, reg1: %d\n", cudaGetErrorString(err), attrib.numRegs);

    //NOT OK:
    //try to get function ptr to pass as an argument:
    const char* ptr = addKernel<float>; // compile error
    err = cudaFuncGetAttributes(&attrib, ptr);
    printf("result: %s, reg2: %d\n", cudaGetErrorString(err), attrib.numRegs);
}

위의 결과 컴파일 오류가 발생합니다.

오류 : 필수 유형과 일치하는 함수 템플릿 "addKernel"의 인스턴스가 없습니다.

편집 : 지금까지 찾은 유일한 해결 방법은 myFunc (첫 번째 코드 예제 참조) 내부의 항목을 매크로에 넣는 것입니다. 이는보기 흉하지만 포인터 인수 전달이 필요하지 않으며 제대로 작동합니다.

#define MY_FUNC(kernel) \
  { \
     ...\
     cudaFuncGetAttributes( &attrib, kernel ); \
     ...\
  }

용법:

MY_FUNC( myKernel<float> )
로버트 크로 벨라

"다른 예"에 포함 된 코드 참조 :

이것을 변경하십시오 :

const char* ptr = addKernel<float>; // compile error

이에:

void (*ptr)(float *, const float *, const float *) = addKernel<float>;

그리고 나는 그것이 올바르게 컴파일되고 실행될 것이라고 믿습니다.

나는 그것이 당신이하려는 일의 전반적인 범위에서 유용할지 여부를 모릅니다.

댓글의 질문에 응답하는 편집 :

함수에서 포인터를 "추출"하면 포인터를 다른 유형으로 캐스트 할 수 있습니다. 시도 해봐. 예를 들어 다음 코드도 작동합니다.

void (*ptr)(float *, const float *, const float *) = addKernel<float>;
const char *ptr1 = (char *)ptr;
err = cudaFuncGetAttributes(&attrib, ptr1);

따라서 질문에 답하기 위해 함수 포인터가 있으면 원하는 경우 함수 포인터를로 캐스팅 수 있습니다const char* .

그건 그렇고, 답변으로 게시 한 코드는 gcc 4.1.2 및 gcc 4.4.6에서 컴파일 오류를 발생시킵니다.

$ nvcc -arch=sm_20 -O3 -o t201 t201.cu
t201.cu: In function âint main()â:
t201.cu:25: error: address of overloaded function with no contextual type information
t201.cu:29: error: address of overloaded function with no contextual type information
$

그리고 &그 두 줄에서 제거하면 오류가 발생 합니다.

$ nvcc -arch=sm_20 -O3 -o t201 t201.cu
t201.cu: In function âint main()â:
t201.cu:25: error: insufficient contextual information to determine type
t201.cu:29: error: insufficient contextual information to determine type
$

따라서이 중 일부는 A 지점에서 B 지점으로 이동하는 데 필요한 단계가 컴파일러에 따라 달라질 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

VLA를 함수 템플릿에 전달하는 방법은 무엇입니까?

분류에서Dev

Meteor 템플릿에 함수를 전달하는 방법은 무엇입니까?

분류에서Dev

배열을 포함하는 구조체를 CUDA의 커널에 전달하는 방법은 무엇입니까?

분류에서Dev

가변 템플릿 함수를 전달하는 방법은 무엇입니까?

분류에서Dev

템플릿 클래스의 멤버 함수에 포인터를 전달하는 방법은 무엇입니까?

분류에서Dev

Angular : 템플릿 함수에서 부울 비동기 변수를 전달하는 방법은 무엇입니까?

분류에서Dev

C ++ 템플릿 함수에 여러 인수를 전달하는 방법은 무엇입니까?

분류에서Dev

템플릿에서 $ scope-variable 함수를 전달하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

함수 결과를 템플릿에 전달하는 방법은 무엇입니까?

분류에서Dev

템플릿 (ShadowDOM)에 포함 된 다른 요소의 함수를 호출하는 방법은 무엇입니까?

분류에서Dev

템플릿 (ShadowDOM)에 포함 된 다른 요소의 함수를 호출하는 방법은 무엇입니까?

분류에서Dev

Azure ARM 템플릿-연결된 템플릿의 출력 변수를 매개 변수로 다른 템플릿에 전달하는 방법은 무엇입니까?

분류에서Dev

템플릿 함수가 매개 변수 팩을 사용할 때 다른 템플릿 매개 변수를 전달하는 방법은 무엇입니까?

분류에서Dev

템플릿에서 django의 뷰로 2 개의 인수를 전달하는 방법은 무엇입니까?

분류에서Dev

비 정적 멤버 함수를 템플릿 인수로 다른 멤버 함수에 전달하는 방법은 무엇입니까?

분류에서Dev

Django 모델에 정의 된 템플릿에서 함수를 호출하는 방법은 무엇입니까?

분류에서Dev

html 템플릿의 Django-object에서 JavaScript 변수를 전달하는 방법은 무엇입니까?

분류에서Dev

Scala + Play : 템플릿의 경로에 매개 변수를 전달하는 방법은 무엇입니까?

분류에서Dev

Spark 매개 변수를 Dataproc 워크 플로 템플릿에 전달하는 방법은 무엇입니까?

분류에서Dev

함수 템플릿의 부분 전문화를 해결하는 방법은 무엇입니까?

분류에서Dev

장고에서 두 개의 템플릿으로 뷰 함수를 연결하는 방법은 무엇입니까?

분류에서Dev

Helm 함수의 템플릿에서 맵 객체를 반환하는 방법은 무엇입니까?

분류에서Dev

blazeComponent의 다른 템플릿에서 함수를 호출하는 방법은 무엇입니까?

분류에서Dev

C ++에서 가변 템플릿 함수를 전문화하는 방법은 무엇입니까?

분류에서Dev

내부 템플릿으로 템플릿 함수를 구성하는 방법은 무엇입니까?

분류에서Dev

템플릿 Haskell : 함수의 인수 개수를 추출하는 방법은 무엇입니까?

분류에서Dev

Angular 앱용 ejs 템플릿에 전달되는 JS 변수를 사용하는 방법은 무엇입니까?

분류에서Dev

Grails : 커스텀 taglib에서 템플릿으로 매개 변수를 전달하는 방법은 무엇입니까?

분류에서Dev

함수 결과를 튜플에 전달하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    VLA를 함수 템플릿에 전달하는 방법은 무엇입니까?

  2. 2

    Meteor 템플릿에 함수를 전달하는 방법은 무엇입니까?

  3. 3

    배열을 포함하는 구조체를 CUDA의 커널에 전달하는 방법은 무엇입니까?

  4. 4

    가변 템플릿 함수를 전달하는 방법은 무엇입니까?

  5. 5

    템플릿 클래스의 멤버 함수에 포인터를 전달하는 방법은 무엇입니까?

  6. 6

    Angular : 템플릿 함수에서 부울 비동기 변수를 전달하는 방법은 무엇입니까?

  7. 7

    C ++ 템플릿 함수에 여러 인수를 전달하는 방법은 무엇입니까?

  8. 8

    템플릿에서 $ scope-variable 함수를 전달하는 가장 좋은 방법은 무엇입니까?

  9. 9

    함수 결과를 템플릿에 전달하는 방법은 무엇입니까?

  10. 10

    템플릿 (ShadowDOM)에 포함 된 다른 요소의 함수를 호출하는 방법은 무엇입니까?

  11. 11

    템플릿 (ShadowDOM)에 포함 된 다른 요소의 함수를 호출하는 방법은 무엇입니까?

  12. 12

    Azure ARM 템플릿-연결된 템플릿의 출력 변수를 매개 변수로 다른 템플릿에 전달하는 방법은 무엇입니까?

  13. 13

    템플릿 함수가 매개 변수 팩을 사용할 때 다른 템플릿 매개 변수를 전달하는 방법은 무엇입니까?

  14. 14

    템플릿에서 django의 뷰로 2 개의 인수를 전달하는 방법은 무엇입니까?

  15. 15

    비 정적 멤버 함수를 템플릿 인수로 다른 멤버 함수에 전달하는 방법은 무엇입니까?

  16. 16

    Django 모델에 정의 된 템플릿에서 함수를 호출하는 방법은 무엇입니까?

  17. 17

    html 템플릿의 Django-object에서 JavaScript 변수를 전달하는 방법은 무엇입니까?

  18. 18

    Scala + Play : 템플릿의 경로에 매개 변수를 전달하는 방법은 무엇입니까?

  19. 19

    Spark 매개 변수를 Dataproc 워크 플로 템플릿에 전달하는 방법은 무엇입니까?

  20. 20

    함수 템플릿의 부분 전문화를 해결하는 방법은 무엇입니까?

  21. 21

    장고에서 두 개의 템플릿으로 뷰 함수를 연결하는 방법은 무엇입니까?

  22. 22

    Helm 함수의 템플릿에서 맵 객체를 반환하는 방법은 무엇입니까?

  23. 23

    blazeComponent의 다른 템플릿에서 함수를 호출하는 방법은 무엇입니까?

  24. 24

    C ++에서 가변 템플릿 함수를 전문화하는 방법은 무엇입니까?

  25. 25

    내부 템플릿으로 템플릿 함수를 구성하는 방법은 무엇입니까?

  26. 26

    템플릿 Haskell : 함수의 인수 개수를 추출하는 방법은 무엇입니까?

  27. 27

    Angular 앱용 ejs 템플릿에 전달되는 JS 변수를 사용하는 방법은 무엇입니까?

  28. 28

    Grails : 커스텀 taglib에서 템플릿으로 매개 변수를 전달하는 방법은 무엇입니까?

  29. 29

    함수 결과를 튜플에 전달하는 방법은 무엇입니까?

뜨겁다태그

보관