2013-11-15 50 views
0

也許我錯過了教程中的一些東西,因爲這會讓我發瘋。向內核傳遞stuct數組會導致段錯誤寫入?

我想完成的工作:我想爲OpenCL設備創建一個結構數組以用作工作區。主機不需要以任何方式看到它或與它進行交互,它只是作爲內核工作的「臨時」空間。

這是我有:

typedef struct { 
    uint64_t a; 
    uint32_t b; 
} result_list; 

初始化暫存空間緩衝「OutputBuffer中」持有MAX_SIZE:

由主程序和OpenCL的內核都可以訪問頭文件內結構的宣言元素:

 cl_mem outputBuffer; 
     outputBuffer = clCreateBuffer(this->context, 
            CL_MEM_READ_WRITE, 
            sizeof(result_list) * MAX_SIZE, 
            NULL, 
            &status); 

我從來不打電話給clEnqueueWriteBuffer因爲主機沒有ca回憶什麼是記憶。它只是爲了內核的工作空間。我把它作爲未初始化但分配。

設置它作爲一個參數爲內核的使用方法:

status = clSetKernelArg(myKernel, 
         1, 
         sizeof(cl_mem), 
         &this->outputBuffer); 

內核(簡體除去非問題的部分):

__kernel void kernelFunc(__global const uint32_t *input, __global result_list *outputBuffer) { 
    if (get_global_id(0) >= MAX_SIZE) { return; } 

    // Make a few local variables and play with them 
    outputBuffer[0].a = 1234; // Memory access violation here 
    // Code never reaches here 
} 

我在做什麼錯?


我安裝了AMD的CodeXL,對調試這類問題沒有什麼幫助。它給我的最多的是「該線程試圖讀取或寫入它無法訪問的虛擬地址。」


編輯:好像真的不喜歡的類型定義。我將它簡化爲typedef uint64_t result_list,並拒絕編譯,稱「ulong類型的值不能分配給類型爲'result_list'的實體,即使result_list - > uint64_t - > unsigned long。

+0

我會首先嚐試使用一個簡單的浮點數組來查看一切正常,然後切換到一個結構。 – Dithermaster

+0

實際上uint64_t的數組會更有意義。首先得到這個工作,然後切換到一個結構。 – Dithermaster

回答

1

你的問題是你不能在HOST和DEVICE中同時放置一個頭文件。 你必須給他們這樣的分離:

//HOST header 
struct mystruct{ 
    cl_ulong a; 
    cl_uint b; 
}; 

//DEVICE header 
typedef struct{ 
    ulong a; 
    uint b; 
} mystruct; 

請注意,我也改變了數據類型爲STANDAR OpenCL的數據類型。您應該使用這些來代替兼容性。