也許我錯過了教程中的一些東西,因爲這會讓我發瘋。向內核傳遞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。
我會首先嚐試使用一個簡單的浮點數組來查看一切正常,然後切換到一個結構。 – Dithermaster
實際上uint64_t的數組會更有意義。首先得到這個工作,然後切換到一個結構。 – Dithermaster