這是一個算法問題,而不是編程問題。我想知道是否可以修改前綴總和(或任何)並行算法來完成以下操作。我想在小於O(N)的時間內從GPU上的兩個輸入列表生成結果。修改並行掃描
規則是:執行數據中的第一個數字,直到鍵中的相同索引包含較小值。
每當我嘗試將它映射到並行掃描時,它都不起作用,因爲我無法確定哪些數據值要在upsweep中傳播,因爲無法知道哪些先前的數據可能傳輸的遠遠不足以進行比較反對當前的關鍵。這個問題讓我想起我們需要考慮當前指數和所有過去指數的波動。
再一次,不需要代碼進行平行掃描(儘管那會很好),更多的是要了解如何完成或爲什麼不能完成。
int data[N] = {5, 6, 5, 5, 3, 1, 5, 5};
int keys[N] = {5, 6, 5, 5, 4, 2, 5, 5};
int result[N];
serial_scan(N, keys, data, result);
// Print result. should be {5, 5, 5, 5, 3, 1, 1, 1, }
代碼來執行串行掃描低於:
void serial_scan(int N, int *k, int *d, int *r)
{
r[0] = d[0];
for(int i=1; i<N; i++)
{
if (k[i] >= r[i-1]) {
r[i] = r[i-1];
} else if (k[i] >= d[i]) {
r[i] = d[i];
} else {
r[i] = 0;
}
}
}