我是 firebase 消息传递和 flutter 的新手。根据 flutter firebase_messaging包文档,onTokenRefresh
当生成新的 FCM 令牌时会触发。根据 Google 的 firebase文档,有两种情况会触发令牌生成:
- 当应用程序初始启动时生成新令牌时
- 每当现有令牌发生更改时
这是我的应用程序功能的简化版本main
。每次执行后,我从模拟器中删除该应用程序,并且显示的令牌确实发生了变化。尽管如此,onTokenRefresh
它永远不会被解雇,如果我对文档的理解是正确的,它应该被解雇。
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
FirebaseMessaging.instance.onTokenRefresh.listen((String token) {
print("New token: $token");
});
String token = await FirebaseMessaging.instance.getToken();
print("Token: $token");
//runApp(MyApp());
}
Run Code Online (Sandbox Code Playgroud)
正如我所说,我是 flutter、dart 和 firebase 消息传递的新手,有什么我从根本上误解的吗?谢谢。
我想衡量一段代码的时间内,我的内核负责。我已经关注了这个问题及其评论,以便我的内核看起来像这样:
__global__ void kernel(..., long long int *runtime)
{
long long int start = 0;
long long int stop = 0;
asm volatile("mov.u64 %0, %%clock64;" : "=l"(start));
/* Some code here */
asm volatile("mov.u64 %0, %%clock64;" : "=l"(stop));
runtime[threadIdx.x] = stop - start;
...
}
Run Code Online (Sandbox Code Playgroud)
答案说做一个转换如下:
计时器计算时钟滴答的次数。要获得毫秒数,请将其除以设备上的 GHz 数并乘以 1000。
我这样做:
for(long i = 0; i < size; i++)
{
fprintf(stdout, "%d:%ld=%f(ms)\n", i,runtime[i], (runtime[i]/1.62)*1000.0);
}
Run Code Online (Sandbox Code Playgroud)
其中 1.62 是我设备的 GPU 最大时钟频率。但是我以毫秒为单位的时间看起来不正确,因为它表明每个线程需要几分钟才能完成。这不可能是正确的,因为执行在不到一秒的挂钟时间内完成。转换公式不正确还是我在某处犯了错误?谢谢。
我是使用 gnuplot 的新手,并且我遵循了这个问题,它根据我的需要绘制了数据。但是,我非常希望还包括误差线。我尝试通过添加最小和最大错误列来做到这一点,如下所示:
Broswer,Video,min,max,Audio,min,max,Flash,min,max,HTML,min,max,JavaScript,min,max
IE,30%,5,5,10%,5,5,25%,5,5,20%,5,5,15%,5,5
Chrome,20%,5,5,5%,5,5,35%,5,5,30%,5,5,10%,5,5
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用修改后的脚本进行绘图,如下所示:
set terminal pdf enhanced
set output 'bar.pdf'
set style data histogram
set style histogram cluster gap 1
set style fill solid border rgb "black"
set auto x
set yrange [0:*]
set datafile separator ","
plot 'data.dat' using 2:xtic(1) title col with yerrorbars, \
'' using 3:xtic(1) title col with yerrorbars, \
'' using 4:xtic(1) title col with yerrorbars, \
'' using 5:xtic(1) title col with yerrorbars, \
'' using 6:xtic(1) title …
Run Code Online (Sandbox Code Playgroud) 我最初认为将指向数组的指针传递给函数的主要优点是防止复制整个数组。然而,这个问题的答案指出,即使函数的参数是int []
它,它也会衰减为指针。我编写了示例代码并自己验证了这一点。
我已经做了谷歌搜索和阅读,主要是我看到的是,从历史上看,使用避免额外算术计算数组索引所需的指针有一些优势。但文章还表示,今天这不再是问题,因为编译器和芯片制造商已经进行了积极的优化,数组索引也同样快。
如果这是真的,显式传递指针是否有任何实际优势?
我不知道这个问题是否会引起基于意见的回应。如果是这样,那不是我的本意。我希望得到一个明确说明明确传递指针的回应。谢谢。
编辑 我读过的文章的链接:
CUDA编程指南的内容如下:
warp一次执行一条通用指令,因此,当warp的所有32个线程都同意它们的执行路径时,就可以实现充分的效率。如果warp的线程通过依赖于数据的条件分支发散,则warp会串行执行所采用的每个分支路径,从而禁用不在该路径上的线程,并且当所有路径完成时,这些线程会聚回到同一执行路径。
由于一次常见的指示,我正在考虑步调一致。
我想写一个函数来告诉我一个指针是主机指针还是设备指针。这本质上是一个包装器cudaPointerGetAttributes()
,如果指针用于设备,则返回 1 或 0。
我无法理解的是,为什么cudaPointerGetAttributes
在测试主机指针时返回无效参数会导致错误检查失败。下面提供了一个示例。
#include <stdio.h>
#include <stdlib.h>
#define CUDA_ERROR_CHECK(fun) \
do{ \
cudaError_t err = fun; \
if(err != cudaSuccess) \
{ \
fprintf(stderr, "Cuda error %d %s:: %s\n", __LINE__, __func__, cudaGetErrorString(err)); \
exit(EXIT_FAILURE); \
} \
}while(0);
int is_device_pointer(const void *ptr)
{
int is_device_ptr = 0;
cudaPointerAttributes attributes;
CUDA_ERROR_CHECK(cudaPointerGetAttributes(&attributes, ptr));
if(attributes.devicePointer != NULL)
{
is_device_ptr = 1;
}
return is_device_ptr;
}
int main()
{
int *host_ptr, x = 0;
int is_dev_ptr;
host_ptr = …
Run Code Online (Sandbox Code Playgroud)