cudaMemcpyToSymbol是否使用字符串
cudaMemcpyToSymbol using or not using string
我试图用这种方式将一个结构复制到常量内存:
struct Foo {
int a, b, c;
};
__constant__ Foo cData;
int main() {
Foo hData = {1, 2, 3};
cudaMemcpyToSymbol(cData, &hData, sizeof(Foo));
// ...
}
这工作得很好,在我的内核中,我可以直接访问常量数据:
__global__ void kernel() {
printf("Data is: %d %d %dn", cData.a, cData.b, cData.c); // 1 2 3
}
但后来我试图使用const char *
作为符号名称,事情停止工作:
cudaMemcpyToSymbol("cData", &hData, sizeof(Foo)); // prints 0 0 0
我原以为两个版本是相似的,但看来我错了。
发生了什么事?
编辑:我想用cudaGetSymbolAddress报告同样的行为,如果没有使用const char *
,它对我有效:
__constant__ int someData[10];
__constant__ int *ptrToData;
int *dataPosition;
cudaGetSymbolAddress((void **)&dataPosition, someData); // Works
// cudaGetSymbolAddress((void **)&dataPosition, "someData"); // Do not work
cudaMemcpyToSymbol(ptrToData, &dataPosition, sizeof(int *));
从CUDA 5开始,不再支持使用字符串作为符号名。这在CUDA 5发布说明中有介绍
•不再支持使用字符串来指示设备符号,这在某些API函数中是可能的。相反,应该直接使用该符号。
这样做的原因之一与启用真正的设备链接器有关,这是CUDA 5中的新功能。
由于一次又一次地得到相同的错误,我想分享这个示例代码,它显示了这个问题的几乎所有示例情况(因此,当我以后再次犯同样的错误时,我可能会参考这里)。
//file: main.cu
#include <stdio.h>
#include <stdlib.h>
#include <cuda.h>
__constant__ float constData[256];
__device__ float devData;
__device__ float* devPointer;
int main(int argc, char **argv)
{
cudaFree(0);
float data[256];
cudaError_t err = cudaMemcpyToSymbol(constData, data, sizeof(data));
printf("Err id: %d, str: %sn", err, cudaGetErrorString(err));
float value = 3.14f;
err = cudaMemcpyToSymbol(devData, &value, sizeof(float));
printf("Err id: %d, str: %sn", err, cudaGetErrorString(err));
float* ptr;
cudaMalloc(&ptr, 256 * sizeof(float));
err = cudaMemcpyToSymbol(devPointer, &ptr, sizeof(ptr));
printf("Err id: %d, str: %sn", err, cudaGetErrorString(err));
cudaFree(ptr);
return EXIT_SUCCESS;
}
我得到了"无效的设备符号"和许多其他与_常数_ _设备_内存使用有关的符号。此代码在运行时不会给出此类错误。
相关文章:
- C++-字符串是否包含一个带有简单循环的单词
- 将常量字符串添加到非常量字符串是否会给出常量字符串
- 检查字符串是否"null" C++
- 使用XOR查找O(n)-解决方案中的两个字符串是否为变位符
- 检查字符串是否为整数
- 使用 SET(C++) 检查两个给定字符串是否是字谜时出现运行时错误
- 如何检查字符串是否正确以将其转换为 int?
- 程序检查字符串是否只包含 1 和 0?
- 检查字符串是否是拉平德罗姆
- 尝试使用 indexOf 创建一个 if 语句来检查字符串是否包含字符.有一点麻烦
- 通过默认复制构造函数比较 C++ 字符串是否会影响性能,原因为何?
- gtest:检查字符串是否等于两个字符串之一
- 如何检查字符串是否包含所有这些:数字、字母和特殊字符
- 如何检查字符串是否以C++中的"ed"结尾;
- 字符串是否在其构造函数中复制数据
- 检查字符串是否是数字,然后将该数字转换为 int?
- 如何检查一个字符串是否包含多个其他字符串?
- 检查字符串是否仅包含字母
- 如何根据一个特定字母的出现来确定两个字符串是否相等?
- 查找字符串是否包含字符串向量的任何一个元素的最佳方法