Memory 在CPU和GPU之间同步静态分配的结构实例
我有一个包含数组的结构,我想将内容从CPU内存中该结构的一个实例复制到GPU内存中的另一个实例 我的问题类似于。这个问题与链接中的问题有两大区别:Memory 在CPU和GPU之间同步静态分配的结构实例,memory,struct,cuda,static-allocation,Memory,Struct,Cuda,Static Allocation,我有一个包含数组的结构,我想将内容从CPU内存中该结构的一个实例复制到GPU内存中的另一个实例 我的问题类似于。这个问题与链接中的问题有两大区别: 我没有使用结构数组。我只需要一个 结构的所有实例都是静态分配的 为了回答我自己的问题,我尝试修改答案中的代码,如下所示: #包括 #包括 #定义cudaCheckError(){\ cudaError_t err=cudaGetLastError()\ 如果(err!=cudaSuccess){\ printf(“Cuda错误:%s:%d:%s\n”
#包括
#包括
#定义cudaCheckError(){\
cudaError_t err=cudaGetLastError()\
如果(err!=cudaSuccess){\
printf(“Cuda错误:%s:%d:%s\n”,“文件”,“行”,“cudaGetErrorString(err))\
出口(1)\
} \
}
结构测试{
字符数组[5];
};
__全局无效内核(测试*开发测试){
对于(int i=0;i<5;i++){
printf(“内核[0][i]:%c\n”,开发测试[0]。数组[i]);
}
}
__设备测试开发测试//dev_测试现在是全局的、静态分配的,并且是结构的一个实例
内部主(空){
int size=5;
Test;//Test现在是静态分配的,并且是结构的一个实例
字符温度[]={a',b',c',d',e'};
memcpy(test.array,temp,size*sizeof(char));
cudaCheckError();
cudaMemcpy(&dev_test,&test,sizeof(test),cudamemcpyhostodevice);
cudaCheckError();
内核(&dev_测试);
cudaCheckError();
cudaDeviceSynchronize();
cudaCheckError();
//无内存
返回0;
}
但此代码会引发运行时错误:
Cuda error: HelloCUDA.cu:34: invalid argument
使用静态分配的
设备变量时,是否有方法将测试
复制到开发测试
?:
我们不使用cudaMemcpy
API。我们使用cudaMemcpyFromSymbol
(或cudaMemcpyFromSymbol
)API
我们不会将\uuuu设备\uuuu
变量作为内核参数传递。它们是全球性的。您只需在内核代码中使用它们
以下代码解决了这些问题:
$ cat t10.cu
#include <stdio.h>
#define cudaCheckError() { \
cudaError_t err = cudaGetLastError(); \
if(err != cudaSuccess) { \
printf("Cuda error: %s:%d: %s\n", __FILE__, __LINE__, cudaGetErrorString(err)); \
exit(1); \
} \
}
struct Test {
char array[5];
};
__device__ Test dev_test; //dev_test is now global, statically allocated, and one instance of the struct
__global__ void kernel() {
for(int i=0; i < 5; i++) {
printf("Kernel[0][i]: %c \n", dev_test.array[i]);
}
}
int main(void) {
int size = 5;
Test test; //test is now statically allocated and one instance of the struct
char temp[] = { 'a', 'b', 'c', 'd' , 'e' };
memcpy(test.array, temp, size * sizeof(char));
cudaCheckError();
cudaMemcpyToSymbol(dev_test, &test, sizeof(Test));
cudaCheckError();
kernel<<<1, 1>>>();
cudaCheckError();
cudaDeviceSynchronize();
cudaCheckError();
// memory free
return 0;
}
$ nvcc -o t10 t10.cu
$ cuda-memcheck ./t10
========= CUDA-MEMCHECK
Kernel[0][i]: a
Kernel[0][i]: b
Kernel[0][i]: c
Kernel[0][i]: d
Kernel[0][i]: e
========= ERROR SUMMARY: 0 errors
$
$cat t10.cu
#包括
#定义cudaCheckError(){\
cudaError_t err=cudaGetLastError()\
如果(err!=cudaSuccess){\
printf(“Cuda错误:%s:%d:%s\n”,“文件”,“行”,“cudaGetErrorString(err))\
出口(1)\
} \
}
结构测试{
字符数组[5];
};
__设备测试开发测试//dev_测试现在是全局的、静态分配的,并且是结构的一个实例
__全局无效内核(){
对于(int i=0;i<5;i++){
printf(“内核[0][i]:%c\n”,dev_test.array[i]);
}
}
内部主(空){
int size=5;
Test;//Test现在是静态分配的,并且是结构的一个实例
字符温度[]={a',b',c',d',e'};
memcpy(test.array,temp,size*sizeof(char));
cudaCheckError();
cudaMemcpyToSymbol(开发测试和测试,尺寸(测试));
cudaCheckError();
内核();
cudaCheckError();
cudaDeviceSynchronize();
cudaCheckError();
//无内存
返回0;
}
$nvcc-o t10 t10.cu
$cuda memcheck./t10
==========CUDA-MEMCHECK
内核[0][i]:a
内核[0][i]:b
内核[0][i]:c
内核[0][i]:d
内核[0][i]:e
======错误摘要:0个错误
$
(您在内核代码中使用的数组也没有意义。dev_test
不是数组,因此您无法索引到它:dev_test[0]…
)