gpt4 book ai didi

c++ - 声明一个全局变量用作局部变量

转载 作者:行者123 更新时间:2023-11-28 07:12:54 25 4
gpt4 key购买 nike

有什么方法可以像声明一个局部变量一样声明一个全局变量吗?

我的意思是:

__device__ int m_myvar;

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

我想将 m_myvar 声明为局部于使用它的函数。有什么办法吗?

最佳答案

原则上,你可以这样做

#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;

}

关于c++ - 声明一个全局变量用作局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20700729/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com