函数在应用程序中花费的总时间可以大致分为两个部分:
通常,剖析器提供函数花费的总时间的估计.是否有可能估算出上述两个组件(Tcomp和Tmem)所花费的时间?
请考虑以下示例代码:
例:
void print(int n) {
cout << "element print\n";
}
void print(vector<int> vec) {
cout << "vector print\n";
}
int main() {
/* call 1 */ print(2);
/* call 2 */ print({2});
std::vector<int> v = {2};
/* call 3 */ print(v);
/* call 4 */ print( std::vector<int>{2} );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它生成以下输出:
element print
element print
vector print
vector print
Run Code Online (Sandbox Code Playgroud)
为什么print函数调用(上例中的调用2)与接受单个值的函数匹配?我在这个调用中创建了一个向量(包含单个元素),所以它与print使用向量作为输入的调用不匹配吗?
为了从主机代码和GPU内核调用相同的函数,我是否必须保留以下相同函数的两个副本:
int sum(int a, int b){
return a+b;
}
__device int sumGPU(int a, int b){
return a+b;
}
Run Code Online (Sandbox Code Playgroud)
或者是否有任何技术来保存/管理功能的单个副本?
在加速应用程序的过程中,我有一个非常简单的内核,它执行类型转换,如下所示:
__global__ void UChar2FloatKernel(float *out, unsigned char *in, int nElem){
unsigned int i = (blockIdx.x * blockDim.x) + threadIdx.x;
if(i<nElem)
out[i] = (float) in[i];
}
Run Code Online (Sandbox Code Playgroud)
全局内存访问是合并的,并且在我的理解中使用共享内存也不会有益,因为没有多个相同内存的读取.有没有人知道是否有任何可以执行的优化来加速这个内核.输入和输出数据已在设备上,因此不需要主机到设备内存副本.
对于下面的循环,我期待输出,sum = 20e6但输出是sum = 1.67772e+07.
float sum=0.0f;
for(i=0;i<20e6;i++)
sum = sum + 1.0f;
printf("sum = %g\n", sum);
Run Code Online (Sandbox Code Playgroud)
问题1:为什么sum浮动不能保持大于1.67772e07?的值?
问题2:如果我在循环中更改语句,sum = sum + 1.001f;则sum的最终值为2.32229e+07.为什么总和的价值有所不同?
问题3:我们可以在上面的循环中控制这种行为,这样我们可以使用float来表示大于1.67772e07仍然增加1.0f的值吗?