16.1에서 이 코드는 종속성으로 인해 외부 루프가 직렬화되고 내부 루프 종속성 #pragma ivdep에서 제거된 경우 예상대로 동작했습니다.
이 루프는 내부 루프가 있는 진정한 종속성으로 인해 직렬화됩니다.
(서명되지 않은 char x = 0, x < 4, x) {
내부 루프는 반복 간 종속성 을 갖지 않지만 외부 루프에 따라 달라집니다.
#pragma ivdep
(서명되지 않은 char y = 0, y<64, y) {
17.0에서 #pragma ivdep는 이제 내부 루프와 외부 루프 모두에 적용되므로 외부 루프의 종속성 은 컴파일러가 고려하지 않습니다. 따라서 에뮬레이션 작업에도 불구하고 하드웨어에서 유사한 코드가 올바르게 작동하지 않을 수 있습니다.
해결:
1. 커널에 추가 인수 "더미"를 추가합니다. 호스트 쪽에서는 이 더미 인수에 대해 항상 1을 전달합니다.
전에
__kernel 무효 my_kernel(
__global cpx_t*는 입력을 제한하고,
__global cpx_t* 결과 제한)
후
__kernel 무효 my_kernel(
__global cpx_t*는 입력을 제한하고,
__global cpx_t*는 결과를 제한하고,
int 더미)
2. 루프 네스트에서 내부 루프를 "if(dummy)"로 래핑합니다.
이 루프는 진정한 종속성으로 인해 직렬화됩니다.
(서명되지 않은 char x = 0, x < 4, x) {
if(더미) {
64회 반복의 각 세트에 종속성 없음
#pragma ivdep
(서명되지 않은 char y = 0, y<64, y) {
이 문제는 FPGA SDK용 인텔© OpenCL™의 향후 버전에서 해결될 예정입니다.