arrays - 如何通过cuda中的索引将数组元素设置为零?
问题描述
我正在尝试使用 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}
。
解决方案
鉴于您的限制,我认为以下内容已经足够好了:
__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
}
推荐阅读
- php - 无法使用 API 将电子邮件发送到 mailgun 的列表
- html - 根据表格 ID 在点击时突出显示表格行
- python - 如何在python中动态地将元组值保存到变量中?
- javascript - 在javascript中对格式DD.MM.YYYY的日期进行排序
- git - 在 git stash -u 和 git stash pop 之后,一些被忽略和未跟踪的文件丢失了
- javascript - 当 Facebook 网站被访问者屏蔽时,如何将网站访问者的数据发送到 Facebook?
- authentication - 使用 Google Cloud Endpoints 在 Google Cloud Run 上保护内部 API 的最佳方式
- html - 如何使此联系表做出响应?
- javascript - 错误:到达数据结尾(数据长度 = 110449,询问索引 = 171816)。损坏的拉链?(节点js,工作表js)
- php - PHP - 在 PHP 中添加具有数组现有值的值的最佳方法是什么?