2011-12-16 60 views
3

嗨,我試圖實現在開放CL距離向量程序..傳遞結構的數組的內核在開放CL

基本上我具有與通過結構的陣列到內核作爲問題參數..

我的結構定義是

typedef struct 
    { 
    int a[nodes][4]; 
    }node; 
    node * srcA; 

該分配存儲器後..我已經使用此代碼

捆綁成一個緩衝對象

和我的內核參數設置這樣

err = clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &memobjs1); 

現在我想這個數組結構(即由srcA表示指出)的傳進我已經這樣做了內核 ..

const char *ocl_test_programs[] = {\ 
       "__kernel void disvec (__global node *x,__global int *p)"\ 
      "{"\ 
     "int i=1,r=1,n;"\ 
      "r=p[1]; "\ 
      "n=p[0];"\ 

      //"for(i=1;i<=n;i++) "\ 

     "{"\ 

      "if(x[r].a[i][2]!=999 && x[r].a[i][2]!=0)"\ 

     "{"\ 

     "int j = get_global_id(0); "\ 

     /* "int k=x[r].a[i][2] + x[i].a[j][2];"\ 
      "if(x[r].a[j][2]>k)"\ 
     "{ "\ 

      " x[r].a[j][2] = k;"\ 
      "x[r].a[j][3] = i; } "\ */ 
     //" } "\ 

    " } "\ 
    " } "\ 
    " } " 
    }; 

當我運行這個程序它說節點類型沒有定義...我必須記住一些其他參數傳遞?有什麼變化,我打破了.. ??如果有人可以至少給我一個簡單的代碼來說明結構傳遞到內核用一個簡單的例子,它將非常感激..非常感謝:)

+0

不要這樣做。你不應該通過結構。改用普通數組。 –

+0

@ SK-邏輯我試圖使用一個3d數組的結構,而不是它說棧對齊問題或類似的東西..因此,我無法做到這一點.. coud你建議一個替代的數據結構我反對使用存儲我已經在struct節點定義中定義了哪些節點? –

+1

嘗試使用平面陣列,相應地重新計算索引。 –

回答

9

您還需要提供內核中的結構定義。編譯內核的編譯器不會奇蹟般地知道C代碼中定義的類型。當你將內核保存在一個單獨的文件中時,這更明顯,而不是將它作爲一個巨大的字符串保存在「主」程序中。

你的內核源代碼應該是這樣的:

typedef struct { 
    int a[nodes][4]; 
} node; 

kernel void disvec (global node *x, global int *p) { 
    /* you kernel code here */ 
}; 
+0

如果我傳入一個x數組,該怎麼辦?我如何索引x – Raaj