我有一个在if语句中调用设备函数的内核.代码如下:
__device__ void SetValues(int *ptr,int id)
{
if(ptr[threadIdx.x]==id) //question related to here
ptr[threadIdx.x]++;
}
__global__ void Kernel(int *ptr)
{
if(threadIdx.x<2)
SetValues(ptr,threadIdx.x);
}
Run Code Online (Sandbox Code Playgroud)
在内核线程0-1中同时调用SetValues.之后会发生什么?我的意思是现在有两个并发的SetValues调用.每个函数调用都是串行执行的吗?所以他们表现得像2个内核函数调用?
tal*_*ies 24
CUDA实际上默认内联所有函数(尽管Fermi和更新的架构也支持带有函数指针和实函数调用的正确ABI).所以你的示例代码被编译成这样的东西
__global__ void Kernel(int *ptr)
{
if(threadIdx.x<2)
if(ptr[threadIdx.x]==threadIdx.x)
ptr[threadIdx.x]++;
}
Run Code Online (Sandbox Code Playgroud)
执行并行发生,就像普通代码一样.如果您将内存竞争设计为函数,则没有可以节省您的序列化机制.