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

Posted

技术标签:

【中文标题】如何通过cuda中的索引将数组元素设置为零?【英文标题】:How to set element of array to zero by index in cuda? 【发布时间】:2021-05-26 12:24:34 【问题描述】:

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

例如 数组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);

作为一个小样本,a = 1,2,3,4,5, index = [2,4]。输出为a = 1,0,3,0,5

【问题讨论】:

【参考方案1】:

鉴于您的限制,我认为以下内容已经足够好:

__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

【讨论】:

以上是关于如何通过cuda中的索引将数组元素设置为零?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过C ++中的数据获得向量的索引

CUDA 通过数组偏移量从设备内存中复制单个元素是不是安全?

NumPy 数组切片索引

通过 JS 获取 Select 选项值并设置数组索引

cublasGemmEx 结果始终为零

试图将文件读入结构数组,但 for 循环仅显示第一个索引而其余索引为零?