Привет, у меня недавно было ядро CUDA для оптимизации. Вот оригинал CUDA ядра:Ядро CUDA для оптимизации
__glboal__ void kernel_base(float *data, int x_dim, int y_dim)
{
int ix = blockIdx.x;
int iy = blockIdx.y*blockDim.y + threadIdx.y;
int idx = iy*x_dim + ix;
float tmp = data[idx];
if(ix % 2)
{
tmp += sqrtf(sinf(tmp) + 1.f);
}
else
{
tmp += sqrtf(cosf(tmp) + 1.f);
}
data[idx] = tmp;
}
dim3 block(1, 512);
dim3 grid(2048/1, 2048/512);
kernel<<<grid,block>>>(d_data, 2048, 2048);
Основная проблема здесь заключается дилемма памяти сливающейся и потоков дивергенции. Исходный код обрабатывает массив в столбце major, поэтому он имеет шаблон доступа к памяти, но не имеет расхождения. Я мог бы изменить его на row-major, что опять-таки имеет проблему расхождения потоков.
У кого-нибудь есть идея, как повысить производительность?
избавится от условного заявления помощи? – Pandrei