@@ -35,8 +35,8 @@ __global__ void convert_int64_to_int128(uint8_t *input, uint8_t *output, size_t
3535 // for (int i = 0; i < 8; ++i) {
3636 // output[idx * 16 + i] = input[idx * 8 + i];
3737 // output[idx * 16 + i + 8] = 0;
38- output_ptr[0 ] = input_ptr[0 ];
39- output_ptr[1 ] = 0 ; // Set the upper 64 bits to zero
38+ // output_ptr[0] = input_ptr[0];
39+ // output_ptr[1] = 0; // Set the upper 64 bits to zero
4040 // }
4141 }
4242}
@@ -56,6 +56,16 @@ __global__ void convert_int32_to_int128(uint8_t *input, uint8_t *output, size_t
5656 }
5757}
5858
59+ __global__ void convert_int32_to_int64 (uint8_t *input, uint8_t *output, size_t count) {
60+ size_t idx = blockIdx .x * blockDim .x + threadIdx .x ;
61+ if (idx < count) {
62+ // Store the converted value as 16 bytes in output
63+ int32_t * input_ptr = reinterpret_cast <int32_t *>(input + idx * 4 );
64+ int64_t * output_ptr = reinterpret_cast <int64_t *>(output + idx * 8 );
65+ output_ptr[0 ] = input_ptr[0 ];
66+ }
67+ }
68+
5969void warmup_gpu () {
6070 // Perform the warmup
6171 cudaFree (0 );
@@ -85,4 +95,15 @@ void convertInt32ToInt128(uint8_t *input, uint8_t *output, size_t count) {
8595 cudaDeviceSynchronize ();
8696}
8797
98+ void convertInt32ToInt64 (uint8_t *input, uint8_t *output, size_t count) {
99+ if (count == 0 ) return ;
100+
101+ // Launch the kernel to convert the data
102+ size_t threads_per_block = 256 ;
103+ size_t blocks = (count + threads_per_block - 1 ) / threads_per_block;
104+
105+ convert_int32_to_int64<<<blocks, threads_per_block>>> (input, output, count);
106+ cudaDeviceSynchronize ();
107+ }
108+
88109} // namespace duckdb
0 commit comments