2011-07-27 37 views
3

有很多現實世界的原因,你想這樣做。 Ours是因爲我們有一個可變長度數據結構的列表,我們希望能夠改變其中一個元素的大小而不用重新複製它們。如何解決inabilty將cl_mem列表傳遞給內核調用?

這裏是我試過幾件事情:

  1. 只是有很多的內核參數。當然,聽起來很不合適,但適用於小N.這實際上是我們一直在做的。
  2. 做1)與某種宏循環擴展內核參數的最大值(我認爲是設備相關的)。我真的不想這樣做......聽起來很糟糕。
  3. 創建一些包含指針的結構列表,並在內核調用之前填充它。我試過了,我認爲它違反了規範。根據我在nVidia論壇上看到的,在一個內核調用之外保存設備指針的地址是非法的。如果任何人都可以指出規範中的說法,我很想知道,因爲我找不到它。然而,它在ATI硬件上肯定會崩潰,因爲它會移動物體。
  4. 放棄,將變量大小的對象存儲在一個大數組中,然後編寫一個聰明的算法來使用空的空間,這樣整個數組必須不經常重排。這會起作用,但是是一個不雅,複雜的設計。此外,它需要大量的可怕的指針算術...

其他人有其他想法嗎?試圖做到這一點的經驗呢?有沒有最簡單的方法?爲什麼?

回答

0

至3: OpenCL 1.1規範第193頁說:「程序中的內核函數的參數不能被聲明爲指向指針的指針。

包含指向指針的指針(指向緩衝區對象的指針)的結構可能並不反對嚴格閱讀這個句子,但它在精神之內:沒有指向緩衝區對象的指針可能作爲參數從主機代碼傳遞到內核,即使它們'隱藏在用戶定義的結構中。

我會選擇選項5:不要使用可變大小的數據結構。如果您有任何方法可以使它們保持恆定大小,請務必做到這一點。它會讓你的生活變得更加輕鬆。確切地說,沒有「可變大小的結構」。每個結構體定義都會產生常量大小的結構體,所以如果大小發生了變化,結構體本身就會發生變化,因此需要另一個mem對象。傳遞給內核函數的每個指針都必須有一個類型。

0

除了sharpnelis答案選項5:

如果對象具有相似的大小,你可以在最大可能的對象大小使用工會。但請確保您使用明確的對齊方式。傳遞第二個緩衝區,標識您的變量大小的對象在靜態大小聯合緩衝區中的每個對象中使用的聯合。

當我使用opencl lib代碼時,我回復了這個,它只允許一個任意類型的變量數組。我只是使用cl_float2來傳遞兩個浮動。由於cl_floatN類型以聯合方式實現 - 對於構建類型也適用,因此也適用於您。