Когда вы вызываете 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! %s\n", 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] = '\0';
--line_len;
}
err = cudaMallocManaged((void**)&(m_keyword[icount]), line_len + 1);
if (err != cudaSuccess)
{
fprintf(stderr, "Error allocating memory for m_keyword[%d]! %s\n", 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;
}