如何在cuda中通过索引将数组元素设置为零?
How to set element of array to zero by index in 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
}
我正在尝试使用 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
}