我想了解OpenCL設備(如GPU)的體系結構,但我無法瞭解爲什麼在本地工作組中的工作項數(即常量CL_DEVICE_MAX_WORK_GROUP_SIZE)上存在顯式限制。爲什麼會有CL_DEVICE_MAX_WORK_GROUP_SIZE?
在我看來,這應該由編譯器負責,也就是說,如果一個(爲了簡單起見,一維)內核在本地工作組大小爲500而其物理最大值爲100的情況下執行,並且內核查找示例像這樣:
__kernel void test(float* input) {
i = get_global_id(0);
someCode(i);
barrier();
moreCode(i);
barrier();
finalCode(i);
}
那麼它可以自動轉換爲與工作組大小100執行這一內核:
__kernel void test(float* input) {
i = get_global_id(0);
someCode(5*i);
someCode(5*i+1);
someCode(5*i+2);
someCode(5*i+3);
someCode(5*i+4);
barrier();
moreCode(5*i);
moreCode(5*i+1);
moreCode(5*i+2);
moreCode(5*i+3);
moreCode(5*i+4);
barrier();
finalCode(5*i);
finalCode(5*i+1);
finalCode(5*i+2);
finalCode(5*i+3);
finalCode(5*i+4);
}
但是,似乎這是不是默認設置。爲什麼不?有沒有辦法使這個過程自動化(除了自己編寫一個預編譯器)?還是有一個內在的問題,可以使我的方法在某些例子上失敗(你能給我一個)?
它會在一個序列中放五個函數調用,不是嗎?所以這隻會是某種退步。此外,您還必須確保將工作維度填充到五的倍數。只是想知道.. – rdoubleui 2012-01-29 20:47:46