@@ -31,12 +31,6 @@ class NetPrivate
3131
3232 Option& opt;
3333
34- #if NCNN_VULKAN
35-
36- int upload_model ();
37-
38- #endif // NCNN_VULKAN
39-
4034 friend class Extractor ;
4135 int forward_layer (int layer_index, std::vector<Mat>& blob_mats, const Option& opt) const ;
4236
@@ -122,52 +116,6 @@ static Option get_masked_option(const Option& opt, int featmask)
122116 return opt1;
123117}
124118
125- #if NCNN_VULKAN
126- int NetPrivate::upload_model ()
127- {
128- ncnn::VkTransfer cmd (vkdev);
129-
130- // create gpu device allocator if null
131- if (!weight_vkallocator)
132- {
133- if (opt.use_weights_in_host_memory )
134- {
135- weight_vkallocator = new VkHostAllocator (vkdev);
136- }
137- else
138- {
139- weight_vkallocator = new VkWeightAllocator (vkdev);
140- }
141- }
142- if (!weight_staging_vkallocator)
143- {
144- weight_staging_vkallocator = new VkWeightStagingAllocator (vkdev);
145- }
146-
147- Option opt_upload = opt;
148- opt_upload.blob_allocator = 0 ;
149- opt_upload.workspace_allocator = 0 ;
150- opt_upload.blob_vkallocator = weight_vkallocator;
151- opt_upload.workspace_vkallocator = weight_vkallocator;
152- opt_upload.staging_vkallocator = weight_staging_vkallocator;
153-
154- for (size_t i = 0 ; i < layers.size (); i++)
155- {
156- if (layers[i]->support_vulkan )
157- {
158- int uret = layers[i]->upload_model (cmd, get_masked_option (opt_upload, layers[i]->featmask ));
159- if (uret != 0 )
160- {
161- NCNN_LOGE (" layer upload_model %d failed" , (int )i);
162- return -1 ;
163- }
164- }
165- }
166-
167- return cmd.submit_and_wait ();
168- }
169- #endif // NCNN_VULKAN
170-
171119int NetPrivate::forward_layer (int layer_index, std::vector<Mat>& blob_mats, const Option& opt) const
172120{
173121 const Layer* layer = layers[layer_index];
@@ -1633,6 +1581,9 @@ int Net::load_model(const DataReader& dr)
16331581 int ret = 0 ;
16341582
16351583#if NCNN_VULKAN
1584+ ncnn::VkTransfer* cmd_upload = 0 ;
1585+ Option opt_upload = opt;
1586+
16361587 if (opt.use_vulkan_compute )
16371588 {
16381589 if (!opt.pipeline_cache )
@@ -1641,6 +1592,31 @@ int Net::load_model(const DataReader& dr)
16411592 d->pipeline_cache = new PipelineCache (d->vkdev );
16421593 opt.pipeline_cache = d->pipeline_cache ;
16431594 }
1595+
1596+ cmd_upload = new ncnn::VkTransfer (d->vkdev );
1597+
1598+ // create gpu device allocator if null
1599+ if (!d->weight_vkallocator )
1600+ {
1601+ if (opt.use_weights_in_host_memory )
1602+ {
1603+ d->weight_vkallocator = new VkHostAllocator (d->vkdev );
1604+ }
1605+ else
1606+ {
1607+ d->weight_vkallocator = new VkWeightAllocator (d->vkdev );
1608+ }
1609+ }
1610+ if (!d->weight_staging_vkallocator )
1611+ {
1612+ d->weight_staging_vkallocator = new VkWeightStagingAllocator (d->vkdev );
1613+ }
1614+
1615+ opt_upload.blob_allocator = 0 ;
1616+ opt_upload.workspace_allocator = 0 ;
1617+ opt_upload.blob_vkallocator = d->weight_vkallocator ;
1618+ opt_upload.workspace_vkallocator = d->weight_vkallocator ;
1619+ opt_upload.staging_vkallocator = d->weight_staging_vkallocator ;
16441620 }
16451621#endif // NCNN_VULKAN
16461622
@@ -1682,6 +1658,36 @@ int Net::load_model(const DataReader& dr)
16821658 ret = -1 ;
16831659 break ;
16841660 }
1661+
1662+ #if NCNN_VULKAN
1663+ if (layer->support_vulkan && opt.use_vulkan_compute && cmd_upload)
1664+ {
1665+ int uret = layer->upload_model (*cmd_upload, get_masked_option (opt_upload, layer->featmask ));
1666+ if (uret != 0 )
1667+ {
1668+ #if NCNN_STRING
1669+ NCNN_LOGE (" layer upload_model %d %s failed" , i, layer->name .c_str ());
1670+ #else
1671+ NCNN_LOGE (" layer upload_model %d failed" , i);
1672+ #endif
1673+ ret = -1 ;
1674+ break ;
1675+ }
1676+
1677+ // commit as soon as we collect 256M pending
1678+ if (cmd_upload->pending_upload_total () > 256 * 1024 * 1024 )
1679+ {
1680+ uret = cmd_upload->submit_and_wait ();
1681+ if (uret != 0 )
1682+ {
1683+ ret = -1 ;
1684+ break ;
1685+ }
1686+
1687+ cmd_upload->reset ();
1688+ }
1689+ }
1690+ #endif // NCNN_VULKAN
16851691 }
16861692
16871693 if (opt.use_local_pool_allocator )
@@ -1705,9 +1711,14 @@ int Net::load_model(const DataReader& dr)
17051711 }
17061712
17071713#if NCNN_VULKAN
1708- if (ret == 0 && opt.use_vulkan_compute )
1714+ if (ret == 0 && opt.use_vulkan_compute && cmd_upload)
1715+ {
1716+ ret = cmd_upload->submit_and_wait ();
1717+ }
1718+
1719+ if (cmd_upload)
17091720 {
1710- ret = d-> upload_model () ;
1721+ delete cmd_upload ;
17111722 }
17121723#endif // NCNN_VULKAN
17131724
0 commit comments