【发布时间】:2022-01-17 23:14:51
【问题描述】:
假设我有一个简单的内核,它对输入数组的每个元素应用两种不同的数学运算。要应用的操作是根据元素在数组中的位置的模来选择的:
__global__ void kernel(float* A, int N)
{
int i = threadIdx.x;
if (i < N) {
float x = A[i];
if (i % 2 == 0) x = cosf(sqrtf(x));
else if (i % 2 == 1) x = sqrtf(logf(x));
A[i] = x;
}
}
int main()
{
// some code...
// Kernel invocation with N threads
kernel<<<1, N>>>(A, N);
// ...some more code
}
为了缩短执行时间,是否有办法通过启动两个内核来绕过逐元素模计算,一个使用x = cosf(sqrtf(x)) 处理偶数索引,另一个使用x = sqrtf(logf(x)) 处理奇数索引?
【问题讨论】:
-
应用程序,我解决了我的问题。
-
为什么不让每个线程都进行两个计算(并运行一半的线程)?
-
能否请您详细说明为什么您认为这样做会更好?
-
我已在更新的答案中详细说明。
标签: cuda