声明要用作本地变量的全局变量

时间:2013-12-20 09:49:50

标签: c++ cuda nvidia

有没有办法将全局变量声明为将其用作本地变量?

我的意思是:

__device__ int m_myvar;

__global__ void myKernel()
{
  .. do something with m_myvar;
}

我想将m_myvar声明为使用它的函数的本地。有办法吗?

1 个答案:

答案 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;

}