求助:cudaMemcpyToSymbol()的使用

firefox424 2010-10-18 09:52:26
定义了一个常数存储器上的数组,想将主内存里的数据使用函数cudaMemcpyToSymbol()复制到该常数存储器上,却出现一下错误,希望大家能帮我解决下,本人在此表示感谢!

__constant__ float3 planeP1[numStructure * 4];
...

unsigned int m_size = numStructure * 4 * sizeof(float3);
...

float3 hPlane_p1[numStructure * 4];
...

CUDA_SAFE_CALL(cudaMemcpyToSymbol( planeP1, hPlane_p1, m_size ));

错误:
error C2664: “cudaMemcpyToSymbol”: 不能将参数 1 从“float3 [48]”转换为“const char *”
与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
...全文
3967 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
gssar 2012-06-12
  • 打赏
  • 举报
回复
请问是怎么解决的?我也遇到了类似问题
[Quote=引用楼主 的回复:]
定义了一个常数存储器上的数组,想将主内存里的数据使用函数cudaMemcpyToSymbol()复制到该常数存储器上,却出现一下错误,希望大家能帮我解决下,本人在此表示感谢!

__constant__ float3 planeP1[numStructure * 4];
...

unsigned int m_size = numStructure * 4 * sizeof(float3……
[/Quote]
Rickyka 2012-06-05
  • 打赏
  • 举报
回复
请问问题解决了吗,我现在也遇到同样的问题
ChicBoi 2011-10-15
  • 打赏
  • 举报
回复
我也碰到了这个问题了,明明别人的例子可以。我的代码就是不能拷贝数组到常量空间。
tinypet 2011-04-15
  • 打赏
  • 举报
回复
API里有三个:
static __inline__ __host__ cudaError_t cudaMemcpyToSymbol(
char *symbol,
const void *src,
size_t count,
size_t offset = 0,
enum cudaMemcpyKind kind = cudaMemcpyHostToDevice
)
{
return cudaMemcpyToSymbol((const char*)symbol, src, count, offset, kind);
}

template<class T>
__inline__ __host__ cudaError_t cudaMemcpyToSymbol(
const T &symbol,
const void *src,
size_t count,
size_t offset = 0,
enum cudaMemcpyKind kind = cudaMemcpyHostToDevice
)
不知道为何调不了第三个? 很诧异,以前也拷过float的。
  • 打赏
  • 举报
回复
可以用其他类型,卷积的例子里见过这样用。
__constant__ float c_Kernel[KERNEL_HIGH][KERNEL_LENGTH];
extern "C" void setConvolutionKernel(float *h_Kernel){
cudaMemcpyToSymbol(c_Kernel, h_Kernel, KERNEL_HIGH*KERNEL_LENGTH * sizeof(float));
}
但从你四行语句中看不出哪错。
firefox424 2010-10-18
  • 打赏
  • 举报
回复
我用的是2.3版的,在cuda_runtime.h中找到的。

那常数存储器里是不是只能用存储char型数据供操作?
  • 打赏
  • 举报
回复
不知道LS的来自哪里.
上面的api定义是3.1版的SDK给出的.呵呵.
firefox424 2010-10-18
  • 打赏
  • 举报
回复
你是指我的第一个参数类型不对吗?这个函数是不能用除char之外的其他类型吗?
我查cudaMemcpyToSymbol()函数原型, 第一个参数好像可以不一定为const char* 类型啊。
template<class T>
__inline__ __host__ cudaError_t cudaMemcpyToSymbol(
const T &symbol,
const void *src,
size_t count,
size_t offset = 0,
enum cudaMemcpyKind kind = cudaMemcpyHostToDevice
)

不太明白。谢谢。
  • 打赏
  • 举报
回复
函数没用对:
cudaError_t cudaMemcpyToSymbol ( const char * symbol,
const void * src,
size_t count,
size_t offset,
enum cudaMemcpyKind kind
)

Copies count bytes from the memory area pointed to by src to the memory area pointed to by offset bytes from the start of symbol symbol. The memory areas may not overlap. symbol can either be a variable that resides in global or constant memory space, or it can be a character string, naming a variable that resides in global or constant memory space. kind can be either cudaMemcpyHostToDevice or cudaMemcpyDeviceToDevice.


Parameters:
symbol - Symbol destination on device
src - Source memory address
count - Size in bytes to copy
offset - Offset from start of symbol in bytes
kind - Type of transfer

231

社区成员

发帖
与我相关
我的任务
社区描述
CUDA on Windows XP
社区管理员
  • CUDA on Windows XP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧