有没有办法将全局变量声明为将其用作本地变量?
我的意思是:
__device__ int m_myvar;
__global__ void myKernel()
{
.. do something with m_myvar;
}
我想将m_myvar声明为使用它的函数的本地。有办法吗?
答案 0 :(得分:1)
原则上,您可以执行类似
的操作#include <cuda.h>
#include <cuda_runtime.h>
#include <stdio.h>
#include <conio.h>
__device__ int m_myvar;
__global__ void myKernel()
{
m_myvar = threadIdx.x+1;
printf("myKernel - thread %i - m_myvar %i\n",threadIdx.x,m_myvar);
}
__global__ void myKernel2()
{
m_myvar = 2*(threadIdx.x+3);
printf("myKernel2 - thread %i - m_myvar %i\n",threadIdx.x,m_myvar);
}
int main() {
myKernel<<<1,4>>>();
myKernel2<<<1,4>>>();
getch();
return 0;
}
正如@talonmies所观察到的那样,在两个内核中并行运行不同线程的m_myvar
将导致竞争条件。因此,当涉及标量m_myvar
或将m_myvar
定义为数组时,您必须考虑使用原子操作
#include <cuda.h>
#include <cuda_runtime.h>
#include <stdio.h>
#include <conio.h>
__device__ int m_myvar[4];
__global__ void myKernel()
{
m_myvar[threadIdx.x] = threadIdx.x+1;
printf("myKernel - thread %i - m_myvar %i\n",threadIdx.x,m_myvar[threadIdx.x]);
}
__global__ void myKernel2()
{
m_myvar[threadIdx.x] = 2*(threadIdx.x+3);
printf("myKernel2 - thread %i - m_myvar %i\n",threadIdx.x,m_myvar[threadIdx.x]);
}
int main() {
myKernel<<<1,4>>>();
myKernel2<<<1,4>>>();
getch();
return 0;
}