2013-03-27 1 views
0

Xcode 4.5.1 및 Grand Central Dispatch를 사용하여 OpenCL에서 가속 구성 요소를 개발 중입니다 (this tutorial 안내).Xcode/OSX의 OpenCL - 커널 루프에서 0을 할당 할 수 없습니다.

전체 커널이 GPU에서 계속 실패하여 SIGABRT 신호를 보냈습니다. 나는 그 이상의 오류를 해석하는 데 많은 진전을 이루지 못했습니다.

하지만 커널의 여러면을 시험해 보았습니다. 루프 내 배열의 특정 위치에 특정 값을 지정하는 것과 관련된 특이한 것을 발견했습니다.

테스트 시나리오 : 초기화 할 배열 인덱스의 고정 범위를 각 스레드에 제공하십시오.

kernel void zero(size_t num_buckets, size_t positions_per_bucket, global int* array) { 

    size_t bucket_index = get_global_id(0); 
    if (bucket_index >= num_buckets) return; 

    for (size_t i = 0; i < positions_per_bucket; i++) 
     array[bucket_index * positions_per_bucket + i] = 0; 
} 

위의 커널이 실패합니다. 그러나 0 대신 1을 지정하면 커널이 성공하고 호스트 코드가 1의 배열을 출력합니다. 다양한 정수 값에 대한 몇 가지 테스트를 토대로 필자는 0과 -1에만 문제가있었습니다.

저는 1-1, (int) 0 등으로 컴파일러를 능가하려고했습니다. 성공하지 못했습니다. 커널 인수로 0을 전달하면 성공했습니다.

제로에 할당 for 루프의 컨텍스트 외부에서 작동합니까

: 위의 구성이 서로 다른 두 시스템에서 확인되었다

array[bucket_index * positions_per_bucket] = 0; 

발견. (OSX 10.7 + GeForce, OSX 10.8 + Radeon.) 또한 CL_DEVICE_TYPE_CPU에서 실행될 때 커널은 문제가 없었습니다. GPU에만 있습니다.

"제로"가 깨질 수는 없으므로 분명히 뭔가 우스꽝스러운 일이 벌어지고 내 목표에 도달해야합니다. 바라건대 그것은 간단합니다. 도와 줘서 고마워.

호스트 코드 :

#include <stdio.h> 
#include <OpenCL/OpenCL.h> 
#include "zero.cl.h" 

int main(int argc, const char* argv[]) { 

    dispatch_queue_t queue = gcl_create_dispatch_queue(CL_DEVICE_TYPE_GPU, NULL); 

    size_t num_buckets = 64; 
    size_t positions_per_bucket = 4; 

    cl_int* h_array = malloc(sizeof(cl_int) * num_buckets * positions_per_bucket); 
    cl_int* d_array = gcl_malloc(sizeof(cl_int) * num_buckets * positions_per_bucket, NULL, CL_MEM_WRITE_ONLY); 

    dispatch_sync(queue, ^{ 

     cl_ndrange range = { 1, { 0 }, { num_buckets }, { 0 } }; 
     zero_kernel(&range, num_buckets, positions_per_bucket, d_array); 
     gcl_memcpy(h_array, d_array, sizeof(cl_int) * num_buckets * positions_per_bucket); 

    }); 

    for (size_t i = 0; i < num_buckets * positions_per_bucket; i++) 
     printf("%d ", h_array[i]); 
    printf("\n"); 

} 

답변

1

가 오픈 CL 표준, 제 6, 제 8 "제한"총알 시점 k (강조 광산) 참조 :

6.8 K. 프로그램의 커널 함수에 대한 인수는 내장 스칼라 유형 bool, half, size_t, ptrdiff_t, intptr_t 및 uintptr_t로 선언 할 수 없습니다. [...]

당신의 컴파일러가 커널을 전혀 만들지 않았다는 사실은 다소 어긋 났음을 나타냅니다.


그래서 당신은 그 문제를 해결 할 수 있습니다 ...하지만 그게 해결되지 않을 경우, 다음은 컴파일러의 버그처럼 CLC의, 즉, 오픈 CL 컴파일러 (평범하고 단순하게 보이는하지 당신을 호스트 코드). 이 커널이 0, -1 이외의 상수와 함께 작동해야하는 이유는 없습니다. OpenCL 드라이버를 업데이트 해 보셨습니까? 다른 운영 체제에서 시도해보십시오 (이 코드는 OS X에만 해당).