【发布时间】:2018-12-02 12:19:36
【问题描述】:
所以我看到一个parent 的问题,关于如何使用cudaMemcpyToSymbol 从主机复制到 GPU 上的常量内存。
我的问题是如何做相反的事情,使用cudaMemcpyFromSymbol从设备常量内存复制到主机。
在下面的最小可重现示例中,我得到了
- 1)
invalid device symbol使用cudaMemcpyFromSymbol(const_d_a, b, size);时出错,或 - 2) 如果我使用
cudaMemcpyFromSymbol(&b, const_d_a, size, cudaMemcpyDeviceToHost),则得到segmentation fault。
我已经咨询了manual,它建议我按照 1) 进行编码,this SO question 建议我按照 2) 进行编码。他们都不在这里工作。
有人可以帮忙提出解决方法吗?我一定是理解不正确...谢谢!
代码如下:
// a basic CUDA function to test working with device constant memory
#include <stdio.h>
#include <cuda.h>
const unsigned int N = 10; // size of vectors
__constant__ float const_d_a[N * sizeof(float)];
int main()
{
float * a, * b; // a and b are vectors. c is the result
a = (float *)calloc(N, sizeof(float));
b = (float *)calloc(N, sizeof(float));
/**************************** Exp 1: sequential ***************************/
int i;
int size = N * sizeof(float);
for (i = 0; i < N; i++){
a[i] = (float)i / 0.23 + 1;
}
// 1. copy a to constant memory
cudaError_t err = cudaMemcpyToSymbol(const_d_a, a, size);
if (err != cudaSuccess){
printf("%s in %s at line %d\n", cudaGetErrorString(err), __FILE__, __LINE__);
exit(EXIT_FAILURE);
}
cudaError_t err2 = cudaMemcpyFromSymbol(const_d_a, b, size);
if (err2 != cudaSuccess){
printf("%s in %s at line %d\n", cudaGetErrorString(err2), __FILE__, __LINE__);
exit(EXIT_FAILURE);
}
double checksum0, checksum1;
for (i = 0; i < N; i++){
checksum0 += a[i];
checksum1 += b[i];
}
printf("Checksum for elements in host memory is %f\n.", checksum0);
printf("Checksum for elements in constant memory is %f\n.", checksum1);
return 0;
}
【问题讨论】:
标签: cuda