Error running concurrent process and storing results in array
data pulverizer
data.pulverizer at gmail.com
Wed May 6 04:52:30 UTC 2020
On Wednesday, 6 May 2020 at 04:04:14 UTC, Mathias LANG wrote:
> On Wednesday, 6 May 2020 at 03:41:11 UTC, data pulverizer wrote:
>> Yes, that's exactly what I want the actual computation I'm
>> running is much more expensive and much larger. It shouldn't
>> matter if I have like 100_000_000 threads should it? The
>> threads should just be queued until the cpu works on it?
>
> It does matter quite a bit. Each thread has its own resources
> allocated to it, and some part of the language will need to
> interact with *all* threads, e.g. the GC.
> In general, if you want to parallelize something, you should
> aim to have as many threads as you have cores. Having 100M
> threads will mean you have to do a lot of context switches. You
> might want to look up the difference between tasks and threads.
Sorry, I meant 10_000 not 100_000_000 I square the number by
mistake because I'm calculating a 10_000 x 10_000 matrix it's
only 10_000 tasks, so 1 task does 10_000 calculations. The actual
bit of code I'm parallelising is here:
```
auto calculateKernelMatrix(T)(AbstractKernel!(T) K, Matrix!(T)
data)
{
long n = data.ncol;
auto mat = new Matrix!(T)(n, n);
foreach(j; taskPool.parallel(iota(n)))
{
auto arrj = data.refColumnSelect(j).array;
for(long i = j; i < n; ++i)
{
mat[i, j] = K.kernel(data.refColumnSelect(i).array, arrj);
mat[j, i] = mat[i, j];
}
}
return mat;
}
```
At the moment this code is running a little bit faster than
threaded simd optimised Julia code, but as I said in an earlier
reply to Ali when I look at my system monitor, I can see that all
the D threads are active and running at ~ 40% usage, meaning that
they are mostly doing nothing. The Julia code runs all threads at
100% and is still a tiny bit slower so my (maybe incorrect?)
assumption is that I could get more performance from D. The
method `refColumnSelect(j).array` is (trying to) reference a
column from a matrix (1D array with computed index referencing)
which I select from the matrix using:
```
return new Matrix!(T)(data[startIndex..(startIndex + nrow)],
[nrow, 1]);
```
If I use the above code, I am I wrong in assuming that the sliced
data (T[]) is referenced rather than copied? That so if I do:
```
auto myData = data[5...10];
```
myData is referencing elements [5..10] of data and not creating a
new array with elements data[5..10] copied?
More information about the Digitalmars-d-learn
mailing list