예상대로 작동하지 않는 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]
감사를 사전에 작동 foo
에 d->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]
D->를 할당 포인트 임의 위치에 있지 않습니다 – Trax
변경'D-> a = b;'~'* d-> a = * b; '는 gcc 버전에서 완벽하게 작동하지만 OpenCL 커널에서는 다음 오류가 발생합니다 : '장치 0에 대한 로그 빌드 : CVMS_ERROR_COMPILER_FAILURE : CVMS 컴파일러가 충돌했거나 요소 .' ** : (** – catdog
글쎄 그건 좋지 않다. 내가해야할 일은 실험 뿐이야. 예를 들어 '인라인'을 삭제하고 어떤 일이 발생하는지 볼 수 있습니다. 또한 'd-> a [0] = b [0];'시도 할 수 있습니다. 또한 짧은 것이 문제가되지 않도록하십시오. 나는 구형 opencl (1.0)이 확장 기능을 지원하지 않는 한 short를 지원하지 않는다고 생각한다. – ScottD