Я с трудом пытаясь выяснить, что это проблема в следующем ядре:UINT массив и для петель в OpenCL
__kernel void test(global unsigned char *word, int len) {
uint chunks[16];
// Init the array with zeros
for (int i = 0;i<16; i++) {
printf("%d\n",i);
chunks[i] = 0;
}
// padding
for (uint i = 0;i<len;i+=4) {
chunks[i/4] = 0;
for(uint j = 0;j<4 && i+j < len;j++) {
uint c = word[i+j]<<(8*(3-j));
chunks[i/4] |= c;
}
}
// bit-wise print of the first element of the array, just as a test
for (int j = 0;j<32;j++) {
printf("%d ",(chunks[0]>>(31-j))&1);
}
}
ядро предназначено, чтобы сделать простой отступы, хранение 4 char
s в uint
. На данный момент это всего лишь тест, поэтому я просто создаю одну рабочую группу, и ядро будет выполняться только один раз.
Проблема в том, что программа принимает SIGABRT
(на самом деле не понимает, когда).
Попытка отследить проблему Я заметил, что код работает нормально, если я прокомментирую часть «init», оставив отступы и бит-мудрую печать, и, наоборот, это работает, если я прокомментирую дополнение, оставив init и печать.
Кроме того, я постоянно получаю SIGABRT
если удалить отступы и заменить побитовую печать первого элемента chunks
с побитовой печатью всего массива
for (int i = 0;i<16; i++) {
for (int j = 0;j<32;j++) {
printf("%d ",(chunks[i]>>(31-j))&1);
}
printf("\n");
}
код работает отлично, если я запустите его, используя CPU вместо GPU (используя непосредственно CL_DEVICE_TYPE_CPU
в главном коде ниже).
Я боюсь, что есть что-то концептуально неправильно в том, что я делаю, но не нашел полезного совета в specs или поиска по сети.
Я использую MacOS 10.8.5. Вот мой код хозяин:
int main(int argc, const char * argv[]) {
char name[128];
dispatch_queue_t queue = gcl_create_dispatch_queue(CL_DEVICE_TYPE_GPU, NULL);
if (queue == NULL) {
queue = gcl_create_dispatch_queue(CL_DEVICE_TYPE_CPU, NULL);
}
// print name of the device
cl_device_id gpu = gcl_get_device_id_with_dispatch_queue(queue);
clGetDeviceInfo(gpu, CL_DEVICE_NAME, 128, name, NULL);
printf("Created a dispatch queue using the %s\n", name);
unsigned char *word = (unsigned char*) malloc(7*sizeof(unsigned char));
sprintf(word, "string");
void* word_mem = gcl_malloc(7 * sizeof(char), word,
CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR);
dispatch_sync(queue, ^{
cl_ndrange range = {
1,
{0, 0, 0},
{1, 0, 0},
{0, 0, 0}
};
test_kernel(&range,(unsigned char*)word_mem, 6);
});
gcl_free(word_mem);
free(word);
dispatch_release(queue);
return 0;
}
Ну, мой GPU действительно является AMD (AMD Radeon HD 6750M). Более того, если бы я не мог использовать 'printf', я ожидал бы ошибки также в тех случаях, когда, как я уже сказал, программа работает. – Saphrosit
Упс, извините. Я только что попробовал свое ядро в AMD FirePro S9150, и он отлично работает с использованием кода на стороне хоста, написанного в OpenCL C++. Я не знаю GCL MacOS. Не могли бы вы попытаться изменить свой код GCL на код OpenCL, чтобы отказаться от этой проблемы на стороне хоста? –
Я попробую позже. Звучит странно, если это так, так как мой хост-код очень похож на яблоко «OpenCL hello world» в своих документах. Я дам Вам знать! – Saphrosit