относительно этой строки:
cudaMemcpy(d_s[i].data,h_s[i].data,sizeof(float *),cudaMemcpyHostToDevice);
что вы просили cudaMemcpy
сделать так:
- получить указатель источника из
h_s[i].data
- используя этот указатель, получить количество
float *
из местоположения, на которое указывает этот указатель - , получить указатель назначения из
d_s[i].data
- , используя этот указатель, сохранить количество, полученное на шаге 2,в любое место указатель с шага 3 указывает на.
Есть множество проблем с этим, но самая основная проблема заключается в том, что вы не хотите делать.
То, что вы пытаетесь скопировать, это значение указателя, содержащееся в (исходное местоположение) h_s[i].data
, и вы хотите сохранить его в (место назначения) d_s[i].data
. Чтобы это работало, вы должны передать указатель в эти местоположения (источник и место назначения).
Это можно исправить, добавив амперсанд к обоим элементам:
cudaMemcpy(&(d_s[i].data),&(h_s[i].data),sizeof(float *),cudaMemcpyHostToDevice);
Это должно исправить ошибку сегмента. И он будет правильно скопировать числовое значение указателя, содержащегося в h_s[i].data
, в d_s[i].data
.
Однако , как я уже говорил ранее, указатель, с которого вы копируетерасположение источника задается здесь:
h_s[i].data = &tdata[i];
, и это указатель на местоположение в памяти хоста . Такой указатель нельзя безопасно использовать в коде устройства CUDA, поэтому на самом деле нет особого смысла усердно работать, чтобы правильно скопировать этот указатель на устройство. Это будет бесполезно в коде устройства.
Вы все еще не поняли необходимость глубокой копии CUDA, чтобы эта схема работала. Как указывалось ранее, это рассматривается пошагово здесь .