2015-10-29 5 views
0

Я с трудом пытаясь выяснить, что это проблема в следующем ядре: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; 
} 

ответ

0

Вы уверены, что вы можете использовать «Printf» в вашем OpenCL ядра для GPU Nvidia?

Я подозреваю, что printf работает только для CL_DEVICE_TYPE_CPU или CL_DEVICE_TYPE_GPU + AMD.

С наилучшими пожеланиями, Мойзес

+0

Ну, мой GPU действительно является AMD (AMD Radeon HD 6750M). Более того, если бы я не мог использовать 'printf', я ожидал бы ошибки также в тех случаях, когда, как я уже сказал, программа работает. – Saphrosit

+0

Упс, извините. Я только что попробовал свое ядро ​​в AMD FirePro S9150, и он отлично работает с использованием кода на стороне хоста, написанного в OpenCL C++. Я не знаю GCL MacOS. Не могли бы вы попытаться изменить свой код GCL на код OpenCL, чтобы отказаться от этой проблемы на стороне хоста? –

+0

Я попробую позже. Звучит странно, если это так, так как мой хост-код очень похож на яблоко «OpenCL hello world» в своих документах. Я дам Вам знать! – Saphrosit