Я понимаю, что вы не хотите, чтобы ваш код был привязан к библиотеке. Тем не менее, я думаю, что Thrust имеет алгоритм, который делает именно то, что вы хотите, при условии, что вы обрабатываете свой список в традиционном C-массиве.
Взгляните на thrust::merge
здесь http://wiki.thrust.googlecode.com/hg/html/group__merging.html
- редактировать -
Подумав немного больше о вашем вопросе, пересечение двух списков непосредственно на GPU кажется очень сложным для написания с помощью CUDA.
Следующий фрагмент кода является альтернативным решением (объединение моего предыдущего решения и @ jmsu's). Это пример того, как пересекать два списка целых чисел, хранящихся в порядке убывания. Списки хранятся в памяти устройства, но вычисления не могут быть выполнены в ядре. Таким образом, вам нужно использовать его между вызовами ядра, если это возможно:
#include <thrust/set_operations.h>
#include <ostream>
int main() {
int A_host[] = {11, 9, 5, 3};
int B_host[] = {14, 12, 10, 5, 1};
int sizeA = 4;
int sizeB = 5;
int sizeC = (sizeA < sizeB) ? sizeA : sizeB;
int C_host[sizeC];
int* A_device;
int* B_device;
int* C_device;
cudaMalloc( (void**) &A_device, sizeof(int) * sizeA);
cudaMalloc( (void**) &B_device, sizeof(int) * sizeB);
cudaMalloc( (void**) &C_device, sizeof(int) * sizeC);
cudaMemcpy( A_device, A_host, sizeof(int) * sizeA, cudaMemcpyHostToDevice);
cudaMemcpy( B_device, B_host, sizeof(int) * sizeB, cudaMemcpyHostToDevice);
cudaMemset( C_device, 0, sizeof(int) * sizeC);
// add an alias to thrust::device_ptr<int> to be more readable
typedef thrust::device_ptr<int> ptrI;
thrust::set_intersection(ptrI(A_device), ptrI(A_device + sizeA), ptrI(B_device), ptrI(B_device + sizeB), ptrI(C_device), thrust::greater<int>() );
cudaMemcpy( C_host, C_device, sizeof(int) * sizeC, cudaMemcpyDeviceToHost);
std::copy(C_host, C_host + sizeC, std::ostream_iterator<int> (std::cout, " ") );
}