假设我有一个数组
X = [1,2,3,4,5,6,7,8,9,10]
是否可以创建较小的数组并根据某些条件填充它们。例如,如果我想将数字从X分离成类似数组
divisibleByTwo = [2,4,6,8,10]
divisibleByThree = [3,6,9]
divisibleByFour = [4,8]
如果我有非并行代码,它将类似于
std::vector<int> divisibleByTwo;
for (int i=0; i<sizeof(x); i++)
{
if (X[i]/2 == 0)
{
divisibleByTwo.emplace_back(X[i]);
}
}
但是我不能在CUDA中做同样的事情,因为那将是比赛条件
我真正想做的是比较两个数组,并将索引存储在条件匹配的新数组中。
例如,
A = [1,2,3]
B = [3,3,2]
,我必须将A的所有元素与B进行比较,并找到元素相等的B的索引。因此结果将是这样的一个数组数组
C[0] = [ ] // indexes of B matching element at index 0 of A (1)
c[1] = [2] // indexes of B matching element at index 1 of A (2)
c[2] = [0, 1] // indexes of B matching element at index 2 of A (3)
答案 0 :(得分:1)
例如divisibleByTwo,您可以启动10个cuda线程,并执行类似的操作:
__global__ void decimate(const float *x, float *y) {
if(threadIdx.x<10 && threadIdx.x%2==0)
y[threadIdx.x/2] = x[threadIdx.x];
}
在上面的示例中,一半的线程不执行任何操作。或者,您可以启动具有5个线程的内核,
__global__ void decimate(const float *x, float *y) {
if(threadIdx.x<5)
y[threadIdx.x] = x[threadIdx.x*2];
}