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");
}