Arrays 如何在cuda中通过索引将数组元素设置为零?

Arrays 如何在cuda中通过索引将数组元素设置为零?,arrays,performance,indexing,parallel-processing,cuda,Arrays,Performance,Indexing,Parallel Processing,Cuda,我正在尝试使用cuda将数组中的一些元素按索引设置为零。我的数组大小大约有7000000个元素。索引长度约为1000。所以我想高效地编写内核代码。我知道的唯一技术是通过cudaOccupancyMaxPotentialBlockSize设置块大小。谁能给我一些加速的建议吗 e、 g。 数组a的指针是double*a,大小为n。索引的指针是int*index,长度为n1 __global__ void setZero(int n, double * a,int n1, const int* ind

我正在尝试使用cuda将数组中的一些元素按索引设置为零。我的数组大小大约有7000000个元素。索引长度约为1000。所以我想高效地编写内核代码。我知道的唯一技术是通过
cudaOccupancyMaxPotentialBlockSize
设置块大小。谁能给我一些加速的建议吗

e、 g。 数组a的指针是
double*a
,大小为
n
。索引的指针是
int*index
,长度为
n1

__global__ void setZero(int n, double * a,int n1, const int* index)
{
  int i = threadIdx.x + blockIdx.x * blockDim.x;
  if (i<n)
  {
    for(int ii=0; ii<n1; ii++) 
      if(i==index[ii]-1)
        a[i] = 0;
  }
}

void main() 
{
    int blockSize;      
    int minGridSize;    
    int gridSize; 
    cudaOccupancyMaxPotentialBlockSize(&minGridSize, &blockSize, setZero, 0, n); 
    gridSize = (n + blockSize - 1) / blockSize;
    setZero<<<gridSize, blockSize>>>(n, d_a, n1, d_index);
}
\uuuuu全局\uuuuu无效设置零(int n,double*a,int n1,const int*index)
{
int i=threadIdx.x+blockIdx.x*blockDim.x;

如果(i考虑到您的限制,我认为以下内容已经足够好了:

__global__ void setZero(int n, double *a, int n1, const int* index, const int* index_size)
{
  int id = threadIdx.x + blockIdx.x * blockDim.x;
  if (id < index_size)
     a[index[id]]=0
}
\uuuuu全局\uuuuu无效setZero(int n,double*a,int n1,const int*index,const int*index大小)
{
int id=threadIdx.x+blockIdx.x*blockDim.x;
如果(id<索引大小)
[index[id]]=0
}