Cuda:访问违规写入位置0x0000000000000000
Cuda: Access violation writing location 0x0000000000000000
我的代码:
int main() {
cudaError_t err = cudaSuccess;
FILE *fp2 = fopen("key.txt", "r");
size_t len = 256;
char *line = (char *)malloc(sizeof(char) * len);
int icount = 0;
char **m_keyword;
cudaMallocManaged(&m_keyword, len *550000 * sizeof(char *));
while (fgets(line, len, fp2) != NULL) {
line[strlen(line) - 1] = ' ';
err = cudaMallocManaged(&(m_keyword[icount]), sizeof(line) / sizeof(char *) * sizeof(char));
if (err != cudaSuccess)
{
fprintf(stderr, "(error code %s)!n", cudaGetErrorString(err));
}
strcpy(m_keyword[icount], line); // Access violation writing location
icount++;
}
free(line);
kern_2D << < 55000, 1 >> > (m_keyword, icount);
cudaDeviceSynchronize();
return 0;
}
我正在编写代码来读取文本文件,其中包含这样的内容
motorcycle ckd
new apsonic
ckd 2017
ckd 2018
motorcycle apsonic
new motorcycle apsonic
如果我运行文件有 2000 行,一切都很好。但是,如果我运行超过 26000 行,则随机收到错误"访问违规写入位置0x0000000000000000"。有些东西可以运行,有些东西出错。 请帮助我。
当你调用cudaMallocManaged()
为m_keyword[icount]
分配内存时,你使用sizeof(line) / sizeof(char*) * sizeof(char)
作为字节长度,这是错误的(4/4 * 1 = 1字节! 您需要改用strlen(line)+1
。
事实上,即使是你第一次打电话给cudaMallocManaged()
也是不正确的。您根本不应该将char*
指针的数量乘以len
。 您分配的字节数是实际需要的 256 倍。
话虽如此,如果cudaMallocManaged()
(或其他任何东西(失败,您根本不会停止程序。 您应该限制while
循环,以确保icount
不超过您为其分配空间的char*
指针的数量。
尝试更多类似的东西:
int main()
{
FILE *fp2 = fopen("key.txt", "r");
if (!fp2)
{
fprintf(stderr, "Error opening file!n");
return 1;
}
const size_t max_lines = 55000;
const size_t max_line_len = 256;
char line[max_line_len];
size_t line_len;
char **m_keyword = NULL;
int icount = 0;
cudaError_t err = cudaMallocManaged((void**)&m_keyword, max_lines * sizeof(char*));
if (err != cudaSuccess)
{
fprintf(stderr, "Error allocating memory for m_keyword! %sn", cudaGetErrorString(err));
fclose(fp2);
return 1;
}
do
{
if (!fgets(line, max_line_len, fp2))
{
if (ferror(fp2) && !feof(fp2))
{
fprintf(stderr, "Error reading from file!n");
fclose(fp2);
return 1;
}
break;
}
line_len = strlen(line);
if ((line_len > 0) && (line[line_len - 1] == 'n'))
{
line[line_len - 1] = ' ';
--line_len;
}
err = cudaMallocManaged((void**)&(m_keyword[icount]), line_len + 1);
if (err != cudaSuccess)
{
fprintf(stderr, "Error allocating memory for m_keyword[%d]! %sn", icount, cudaGetErrorString(err));
fclose(fp2);
return 1;
}
strcpy(m_keyword[icount], line);
++icount;
}
while (icount < max_lines);
fclose(fp2);
kern_2D << < max_lines, 1 >> > (m_keyword, icount);
cudaDeviceSynchronize();
return 0;
}
相关文章:
- 将值指定给向量(2D)的向量中的某个位置
- 使用Unreal C++获取VR耳机的世界位置/方向
- 写入位置0x0000000C时发生访问冲突
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 如何使用cudaMallocManaged在指针位置初始化对象?(C++)
- 无法获取webot::PositionSensor对象中位置传感器的值
- 非常量变量只读位置的赋值
- 如何定义更改car类中car位置的方法
- 使用迭代器时如何访问对象在向量中的位置?
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 求最大元素位置的分治算法
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- 如何将元素添加到向量的字符串位置
- 如何选择在 csv 文件中输出的位置
- 无法打开 fstream C++文件,即使它与 .cpp 位于同一位置
- 如何在特定位置追加 json 文件
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- OpenGL - 在 NDC 中计算位置适用于着色器,但不适用于'regular'程序