Каждый поток получит одинаковые входные параметры, поэтому в этом случае char *text
одинаков в каждом потоке - это фундаментальная часть модели программирования.Так как указатель указывает на глобальную память, если один поток изменяет данные через указатель (то есть изменяет глобальную память), то это изменение влияет на все потоки (игнорируя опасности).
Это точно так же, как стандарт C, за исключениемтеперь у вас есть несколько потоков, доступ к которым осуществляется через указатель.Другими словами, если вы изменяете text [0] внутри стандартной функции C, тогда изменения видны вне функции.
Если я правильно понимаю, вы просите, чтобы у каждого потока была локальная копиясодержание text
.Ну, решение точно такое же, как и для стандартного C, если вы не хотите, чтобы изменения были видны вне функции:
__global__ void kern(char* text, int N) {
// If you have an upper bound for N...
char localtext[NMAX];
// If you don't know the range of N...
char *localtext;
localtext = malloc(N*sizeof(char));
// Copy from text to localtext
// Since each thread has the same value for i this will
// broadcast from the L1 cache
for (int i = 0 ; i < N ; i++)
localtext[i] = text[i];
//...
}
Обратите внимание, что я предполагаю, что у вас sm_20 или более поздняя версия.Также обратите внимание, что хотя использование malloc в коде устройства возможно, вы заплатите цену за производительность.