说我有这个玩具代码:可以使用__syncthreads()合并单独的CUDA内核吗?
#define N (1024*1024)
#define M (1000000)
__global__ void cudakernel1(float *buf)
{
int i = threadIdx.x + blockIdx.x * blockDim.x;
buf[i] = 1.0f * i/N;
for(int j = 0; j < M; j++)
buf[i] *= buf[i];
}
__global__ void cudakernel2(float *buf)
{
int i = threadIdx.x + blockIdx.x * blockDim.x;
for(int j = 0; j < M; j++)
buf[i] += buf[i];
}
int main()
{
float data[N];
float *d_data;
cudaMalloc(&d_data, N * sizeof(float));
cudakernel1<<<N/256, 256>>>(d_data);
cudakernel2<<<N/256, 256>>>(d_data);
cudaMemcpy(data, d_data, N * sizeof(float), cudaMemcpyDeviceToHost);
cudaFree(d_data);
}
我可以合并两个内核,像这样:
#define N (1024*1024)
#define M (1000000)
__global__ void cudakernel1_plus_2(float *buf)
{
int i = threadIdx.x + blockIdx.x * blockDim.x;
buf[i] = 1.0f * i/N;
for(int j = 0; j < M; j++)
buf[i] *= buf[i];
__syncthreads();
for(int j = 0; j < M; j++)
buf[i] += buf[i];
}
int main()
{
float data[N];
float *d_data;
cudaMalloc(&d_data, N * sizeof(float));
cudakernel1_plus_2<<<N/256, 256>>>(d_data);
cudaMemcpy(data, d_data, N * sizeof(float), cudaMemcpyDeviceToHost);
cudaFree(d_data);
}
就是一般的情况下,其采取相同的块和线程参数连续两个内核可与中间合并__syncthreads()
是真的吗? (我的真实情况是6个连续的非平凡内核,有很多设置和拆卸开销)。
对于一般情况下,没有。 '__syncthreads()'不是设备范围内的执行障碍。这只是在块级别上的障碍。所以我可以拿出内核来做一个设备宽泛的操作,这个内核将会中断。这并不是说,你不能结合的内核,但是你必须仔细考虑的是单独的内核可能已经趁势任何设备范围内的同步行为(内核启动是一个设备级的同步,在同一内核流)。 –
请将此作为答案发布,以便我可以为您投票! –