Anonymous
Как маска работает в функциях перетасовки Cuda Warp? [закрыто]
Сообщение
Anonymous » 15 июл 2025, 14:53
Платформа: nvidia l40 < /p>
Мой тестовый код: < /p>
Код: Выделить всё
#define SIZE 1024
__global__ void test_shfl_sync(int* x, int N){
int tid = threadIdx.x;
int val = tid ;
x[tid] = __shfl_sync(0xffffffff, val, 1);
__syncwarp();
}
int main(){
int* x = (int *)malloc(sizeof(int) * SIZE);
int* y = (int *)malloc(sizeof(int) * SIZE);
for(int i = 0; i < SIZE; i++){
x[i] = i;
y[i] = 0;
}
int *d_x1;
cudaMalloc(&d_x1, sizeof(int) * SIZE);
cudaMemcpy(d_x1, x, sizeof(int) * SIZE, cudaMemcpyHostToDevice);
int THREAD_NUM_PER_BLOCK = 64;
int block_num = (SIZE + THREAD_NUM_PER_BLOCK - 1) / THREAD_NUM_PER_BLOCK;
test_shfl_sync(d_x1, SIZE);
cudaDeviceSynchronize();
cudaMemcpy(y, d_x1, sizeof(int) * SIZE, cudaMemcpyDeviceToHost);
for(int i = 0; i < 64; i++){
printf("%d ", y[i]);
}
printf("\n");
}
< /code>
А печать: 1 1 ... 1 33 33 ... 33 < /code> (есть тридцать два 1 и тридцать два 33).
Затем я изменяю ядро: < /p>
__global__ void test_shfl_sync(int* x, int N){
int tid = threadIdx.x;
int val = tid ;
x[tid] = __shfl_sync(0xfffffffe, val, 1);
__syncwarp();
}
< /code>
lane 0 замаскирована, поэтому ожидаемая печать:0 1 1 ... 1 32 33 33 ... 33, но я получил все нули: 0 0 ... 0 0 0 ... 0 .
Почему это произошло?
Подробнее здесь:
https://stackoverflow.com/questions/797 ... -functions
1752580412
Anonymous
Платформа: nvidia l40 < /p> Мой тестовый код: < /p> [code]#define SIZE 1024 __global__ void test_shfl_sync(int* x, int N){ int tid = threadIdx.x; int val = tid ; x[tid] = __shfl_sync(0xffffffff, val, 1); __syncwarp(); } int main(){ int* x = (int *)malloc(sizeof(int) * SIZE); int* y = (int *)malloc(sizeof(int) * SIZE); for(int i = 0; i < SIZE; i++){ x[i] = i; y[i] = 0; } int *d_x1; cudaMalloc(&d_x1, sizeof(int) * SIZE); cudaMemcpy(d_x1, x, sizeof(int) * SIZE, cudaMemcpyHostToDevice); int THREAD_NUM_PER_BLOCK = 64; int block_num = (SIZE + THREAD_NUM_PER_BLOCK - 1) / THREAD_NUM_PER_BLOCK; test_shfl_sync(d_x1, SIZE); cudaDeviceSynchronize(); cudaMemcpy(y, d_x1, sizeof(int) * SIZE, cudaMemcpyDeviceToHost); for(int i = 0; i < 64; i++){ printf("%d ", y[i]); } printf("\n"); } < /code> А печать: 1 1 ... 1 33 33 ... 33 < /code> (есть тридцать два 1 и тридцать два 33). Затем я изменяю ядро: < /p> __global__ void test_shfl_sync(int* x, int N){ int tid = threadIdx.x; int val = tid ; x[tid] = __shfl_sync(0xfffffffe, val, 1); __syncwarp(); } < /code> lane 0 замаскирована, поэтому ожидаемая печать:0 1 1 ... 1 32 33 33 ... 33[/code], но я получил все нули: 0 0 ... 0 0 0 ... 0 . Почему это произошло? Подробнее здесь: [url]https://stackoverflow.com/questions/79701490/how-the-mask-work-in-cuda-warp-shuffle-functions[/url]