2013-05-07 5 views
0

예상대로 작동하지 않는 OpenCL 커널 코드가 있습니다. gcc로 컴파일 된 비슷한 C 코드가 정상적으로 작동합니다.OpenCL : 인라인 함수에서 구조체 필드 초기화가 작동하지 않습니다.

struct data { 
    short* a; 
}; 

typedef struct data Data; 

inline void foo(Data* d) { 
    short b[1] = {99}; 
    d->a = b; 
} 

__kernel void bar(__global short* output) { 
    Data d; 
    foo(&d); 
    short val = d.a[0]; 
    int id = get_global_id(0); 
    output[id] = val; 
} 

항상 [0, 0, ..., 0]을 출력합니다. 내가 __kernel bar에서 d.a를 초기화 만 예상 출력 [99, 99, ..., 99]

감사를 사전에 작동 food->a[0] = 99를 할당하면
!

업데이트 :
호스트 코드로 Java 및 JOCL을 사용하고 있습니다.

ScottD가 제안한대로 foo에서 *d->a = *b;까지 d->a = b;을 변경했습니다.
그리고 그것은 C 버전에서 훌륭하게 작동합니다. 함수 foo가 사용하는 포인터를 설정합니다

Exception in thread "main" org.jocl.CLException: 
CL_BUILD_PROGRAM_FAILURE Build log for device 0: 
CVMS_ERROR_COMPILER_FAILURE: CVMS compiler has crashed or hung building an element. 
at org.jocl.CL.clBuildProgram(CL.java:9368) 
... 

또는 AMD의 CPU와 Windows에서 JVM 종료 :

내가 믿는
# A fatal error has been detected by the Java Runtime Environment: 
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000007fedfeb007a, pid=3816, tid=4124 
# JRE version: 7.0-b147 
# Java VM: Java HotSpot(TM) 64-Bit Server VM (21.0-b17 mixed mode windows-amd64 compressed oops) 
# Problematic frame: 
# C [amdocl64.dll+0x60007a] 

답변

2

문제는 이것이다 그러나 맥 OS에서 OpenCL을위한 다음과 같은 오류가 발생합니다 foo가 반환 할 때 범위를 벗어나는 지역 변수의 주소로 호출자. 호출자가 해당 포인터에 액세스 할 때 범위를 벗어난 변수의 데이터는 여전히 99 일 수도 있고 그렇지 않을 수도 있습니다. 설명하려면이 코드에 대한 gcc 디버그 빌드를 작성하십시오. 그것은 작동합니다. foo (& d) 이후와 val = da [0] 앞에 printf (hello \ n ")를 추가하면 printf 호출이 범위 99의 값을 포함하는 스택 메모리를 오버라이드하기 때문에 실패합니다 ..

은 아마 당신이 의도 :.

* D-> A = * B를, D-> A = B 대신에,

+0

D->를 할당 포인트 임의 위치에 있지 않습니다 – Trax

+0

변경'D-> a = b;'~'* d-> a = * b; '는 gcc 버전에서 완벽하게 작동하지만 OpenCL 커널에서는 다음 오류가 발생합니다 : '장치 0에 대한 로그 빌드 : CVMS_ERROR_COMPILER_FAILURE : CVMS 컴파일러가 충돌했거나 요소 .' ** : (** – catdog

+0

글쎄 그건 좋지 않다. 내가해야할 일은 실험 뿐이야. 예를 들어 '인라인'을 삭제하고 어떤 일이 발생하는지 볼 수 있습니다. 또한 'd-> a [0] = b [0];'시도 할 수 있습니다. 또한 짧은 것이 문제가되지 않도록하십시오. 나는 구형 opencl (1.0)이 확장 기능을 지원하지 않는 한 short를 지원하지 않는다고 생각한다. – ScottD