Код: Выделить всё
#include
#include
#include
int *d_x;
static constexpr int N = 1;
__global__ void init_buff(int *buff) {
for (int i = 0; i < N; i++) {
buff[i] = i;
}
}
__global__ void kernel_loop(volatile int *buff) {
while (true) {
__threadfence();
if (buff[0]) {
break;
}
}
}
__global__ void kernel_write(volatile int *buff) {
buff[0] = 1;
}
int main() {
cudaMalloc(reinterpret_cast(&d_x), sizeof(int) * N);
init_buff(d_x);
cudaDeviceSynchronize();
cudaStream_t stream1, stream2;
cudaStreamCreateWithFlags(&stream1, cudaStreamDefault);
cudaStreamCreateWithFlags(&stream2, cudaStreamDefault);
cudaDeviceSynchronize();
kernel_loop(d_x);
kernel_write(d_x);
cudaDeviceSynchronize();
return 0;
}
< /code>
Кроме того, если я изменяю порядок запускам как SO: < /p>
kernel_write(d_x);
kernel_loop(d_x);
< /code>
Программа работает до завершения. < /p>
Кроме того, < /p>
cudaStreamCreateWithFlags(&stream1, cudaStreamNonBlocking);
cudaStreamCreateWithFlags(&stream2, cudaStreamNonBlocking);
Редактировать: < /p>
Согласно комментарию Ext3h, добавил __threadfence () в ядро писателя. < /p>
Подробнее здесь: https://stackoverflow.com/questions/794 ... definitely